#java #android #try-catch
#java #Android #попробуй-поймай
Вопрос:
if (getOperator=="/"){
try {
sum = value1/value2;
} catch (Exception e) {
summaryTxt.setText("Invalid operation");
}
}
Что здесь не так?
Комментарии:
1. Это не имеет прямого отношения к вашему вопросу, но вы никогда не должны сравнивать строки с == . Вместо этого используйте Equals. == предназначен для сравнения ссылок на память. Также либо вы используете имя получателя getOperator, а ваше отсутствует (), либо вам следует использовать лучшее имя (например, operator).
Ответ №1:
Это неправильно, и это плохая практика.
Представьте, что значение1 может быть целым числом, и оно равно null. Затем вы поймаете исключение NullPointerException, но ваш код сообщит вам, что операция недопустима, но это не так.
Исключения не предназначены для проверки условий. Лучше проверять их явно:
if (getOperator=="/"){
if (value2 == 0) {
summaryTxt.setText("Value2 can't be 0!");
} else {
sum = value1/value2;
}
}
Комментарии:
1. 1: Исключения никогда не следует использовать для управления потоком, особенно когда достаточно простых
if-else
проверок. @user655443: Если это сообщение не отображается, тоvalue2
не равно нулю. И, следовательно, ошибки деления на ноль не будет.2. Я пытаюсь if (getOperator==»/»){ { if (value2 == 0) { Log.d(«test», «eeee»); summaryTxt.setText(«» «Value2 не может быть 0!»); } else { сумма = значение1 /значение2; } } }
3. и это показывает «eeee» в Logcat, когда value2 = 0, но это не показывает «Value2 не может быть 0!»
4. Тогда это не связанная проблема. Задайте другой вопрос и покажите больше кода: как вы определяете summaryTxt, где выполняется этот код и так далее.
5. Кстати, кэширование исключения должно быть быстрее, чем использование if каждый раз, когда вы хотите разделить. Но просто при чтении кода и контекста влияние было бы незначительным. Это просто для того, чтобы включить один смысл среди других, кто-то предпочел бы перехватить арифметическую ошибку.
Ответ №2:
Деление на ноль вызовет исключение ArithmeticException, если значения являются, например, целыми числами, так что это то, что вы должны уловить.
Выполнение деления на ноль с использованием doubles вместо этого даст результат Double.Бесконечность
Ответ №3:
Я использую следующее для обработки деления на ноль и NaN:
public static double safeDivide(double dividend, double divisor) {
if(Double.compare(divisor, Double.NaN) == 0) return Double.NaN;
if(Double.compare(dividend, Double.NaN) == 0) return Double.NaN;
if(Double.compare(divisor, 0.0) == 0) {
if(Double.compare(dividend, 0.0) == -1) {
return Double.NEGATIVE_INFINITY;
}
return Double.POSITIVE_INFINITY;
}
if(Double.compare(divisor, -0.0) == 0) {
if(Double.compare(dividend, -0.0) == 1) {
return Double.NEGATIVE_INFINITY;
}
return Double.POSITIVE_INFINITY;
}
return dividend / divisor;
}
Ссылка:
math.stackexchange >> Я узнал, что 1/0 — это бесконечность, почему это не минус бесконечность?
Ответ №4:
Если вы хотите сделать это путем перехвата исключения, то:
if (getOperator == "/") {
try {
sum = value1 / value2;
} catch (ArithmeticException e) {
summaryTxt.setText("Invalid operation: " e.getMessage());
}
}
Перехват Exception
определенно плохая идея в целом, если не в данном конкретном случае. Проблема в том, что есть большая вероятность, что вы поймаете исключения другого типа, которые вы (программист) не ожидали; например, исключение NullPointerException в этом случае, если тип value1
или value2
является примитивным классом-оболочкой, а значение null
.
Также спорно, следует ли вам реализовать это с помощью исключений или путем явного тестирования на ноль. ИМО, здесь приемлемлюбой способ. Деление на ноль, скорее всего, будет редким явлением для этого кода, и правило таково, что вы должны использовать исключения только в исключительных ситуациях. (Вам не обязательно, но вы можете …)
Тем не менее, я думаю, что я бы использовал явный тест на том основании, что это облегчает чтение кода.
if (getOperator == "/") {
if (value2 != 0) {
sum = value1 / value2;
} else {
summaryTxt.setText("Invalid operation: divide by zero");
}
}
(В сторону: getOperator == "/"
это сомнительно, если только ваш код не гарантирует, что getOperator всегда содержит встроенную строку …)
Ответ №5:
Вы могли бы просто проверить, равно ли Значение2.(0); И выдать свое собственное исключение, если это так
Ответ №6:
напишите функцию расширения, подобную этой
Double.safeDiv(other:Number,fallback:Double):Double {
if(other == 0)
return fallback
else
return this / other
}
где запасной вариант — это значение, которое вы хотите вернуть, когда делитель равен 0
Ответ №7:
if (getOperator=="/" amp;amp; value2 == 0){
summaryTxt.setText("Value2 can't be 0!");
}else if(getOperator=="/" amp;amp; != 0){
sum = value1/value2;
}
такой красивый код)