2014-12-16 4 views
0

я следующий класс:RuntimeException и ArithmeticException Java

public class TryCatchExample { 
    public static void main(String[] args) { 
     try { 
      System.out.println(1/0); 
     }catch (RuntimeException e) { 
      System.out.println("Runtime exception"); 
     } catch (ArithmeticException e) { 
      System.out.println("Trying to divide by 0 is not ok."); 
     } 
     finally { 
      System.out.println("The program will now exit"); 
     } 
    } 
} 

Компилятор выдает эту ошибку:

TryCatchExample.java:10: error: exception ArithmeticException has already been caught 
     } catch (ArithmeticException e) { 
     ^
1 error 

Почему это происходит? ArithmeticException - это подмножество RuntimeException, поэтому это будет бросать исключение RuntimeException или исключение ArithmeticException?

Спасибо!

ответ

4

ArithmeticExceptionявляется подклассом из RuntimeException, что означает, что он уже будет обрабатываться catch (RuntimeException e) ... отрасли.

Вы можете изменить порядок ветви, так что ArithmeticException пойман первый, и любой другой RuntimeException провалится в соседней ветке:

try { 
    System.out.println(1/0); 
} catch (ArithmeticException e) { 
    System.out.println("Trying to divide by 0 is not ok."); 
} catch (RuntimeException e) { 
    System.out.println("Runtime exception"); 
} finally { 
    System.out.println("The program will now exit"); 
} 
0

ошибка компилятора, поскольку более широкое исключение должно быть пойманной last.Imagine объект исключения является похожим на шарик, который падает на разные уровни пирамиды (стек пирамидных плит). Более узкое исключение (подтип) улавливается в верхней и более широкой (суперклассе) внизу. Это не дает компиляции ошибка.

catch (ArithmeticException e) { 
     System.out.println("Trying to divide by 0 is not ok."); 
    }catch (RuntimeException e) { 
     System.out.println("Runtime exception"); 
    } 
0

Sure ArithmeticException является подмножеством RuntimeException.
Арифметическое исключение - это ошибка, которая возникает, когда возникает «неправильная» арифметическая ситуация. Обычно это происходит, когда в программе во время выполнения возникают ошибки или ошибки вычисления . Но если вы поймаете исключение с обоими классами, приоритет catch должен быть сверху вниз, а ошибки будут выбрасываться к реальному исключению.

Ниже код будет подбрасывает ArithmeticException:

public static void main(String[] args) { 
     try { 

      System.out.println(1/0); 

     }catch (ArithmeticException e) { 
      System.out.println("Trying to divide by 0 is not ok."); 
     } catch (RuntimeException e) { 
      System.out.println("Runtime Exception"); 
     } 
     finally { 
      System.out.println("The program will now exit"); 
     } 
    } 

Ниже код будет подбрасывает RuntimeException:

public static void main(String[] args) { 
     try { 

      int div = Integer.parseInt(args[0]); 

      int result = 1/div; 

      System.out.println(result); 

     }catch (ArithmeticException e) { 
      System.out.println("Trying to divide by 0 is not ok."); 
     } catch (RuntimeException e) { 
      System.out.println("Runtime Exception"); 
     } 
     finally { 
      System.out.println("The program will now exit"); 
     } 
    } 
Смежные вопросы