2013-11-23 2 views
4

Я новичок в Java, и у меня возникает небольшая проблема с метанием исключений. А именно, почему это неверноПочему я не могу исключить исключение в методе (Java)

public static void divide(double x, double y){ 
    if(y == 0){ 
    throw new Exception("Cannot divide by zero."); 
     //Generates error message that states the exception type is unhanded 
} 
else 
    System.out.println(x + " divided by " + y + " is " + x/y); 
    //other code follows 
} 

Но это нормально?

public static void divide(double x, double y){ 
if(y == 0) 
    throw new ArithmeticException("Cannot divide by zero."); 
else 
    System.out.println(x + " divided by " + y + " is " + x/y); 
    //other code follows 
} 
+0

Blame парня по имени Гудэнафа, ч 1974. –

ответ

9

ArithmeticException является RuntimeException, поэтому он не должен быть объявлен в пункте throws или пойманы catch блока. Но Exception не является RuntimeException.

Section 11.2 of the JLS покрывает это:

непроверенным классы исключений (§11.1.1) освобождаются от проверки времени компиляции.

«Непроверенные классы исключений» включают Error s и RuntimeException s.

Кроме того, вы хотите проверить, если y является 0, не если x/y является 0.

+0

Я хотел бы генерировать NotSerializableException, когда объект создается для сериализации - путем проверки 'если (someObj InstanceOf Сериализуемый)' Это не возможно тогда? – Lealo

3

Вы должны добавить throws в подписи метода только для неконтролируемого exceptions.For например:

public static void divide(double x, double y) throws Exception { 
... 
} 

С ArithmeticException extends RuntimeException, нет необходимости в throws во втором примере.

Подробнее:

0

Методы, которые генерируют исключения в Java должны delcare его в подписи метода

public static void divide(double x, double y) throws Exception

Без декларации ваш код не будет компилироваться.

Существует специальное подмножество исключений, которые расширяют класс RuntimeException. Эти исключения не должны быть объявлены в сигнатуре метода.

ArithmeticException расширяет RuntimeException

Смежные вопросы