2016-07-04 4 views
2

У меня есть следующий код в практике вопрос:Почему это исключение не вызывает ошибку времени выполнения?

public class Test { 

    static String s = ""; 

    public static void m0(int a, int b) { 
     s += a; 
     m2(); 
     m1(b); 
    } 

    public static void m1(int i) { 
     s += i; 
    } 

    public static void m2() { 
     throw new NullPointerException("aa"); 
    } 

    public static void m() { 
     m0(1, 2); 
     m1(3); 
    } 

    public static void main(String args[]) { 
     try { 
      m(); 
     } catch (Exception e) { 
     } 
     System.out.println(s); 
    } 
} 

В методе м2, когда NullPointerException брошено, почему он не завершает нить, как я ожидал? Я думал, что в том же методе не было блока catch try, это вызовет исключение и остановит программу.

Как я понял, он вернулся к ранее названному методу m0, когда я думал, что исключение, которое было исключено, остановило бы программу. Конечным результатом является то, что программа печатает 1, как значение s.

Все, что я прочитал до сих пор об исключениях, не объясняет эту логику, и я не могу ее самостоятельно обработать, поэтому я надеялся, что смогу получить помощь! Заранее спасибо.

+0

сделал вас попробуйте отладки? – AdamSkywalker

+5

Исключения составляют пузырь до тех пор, пока они не «поймают» или не сбрасывают верхнюю часть стека выполнения. это означает, что ваш 'catch' в' main() 'улавливает и НЕ НИЧЕГО, поскольку блок catch пуст. (например, 'System.out.println (« Эй, я что-то поймал »), и повторите попытку. –

+0

@AdamSkywalker да, просто попробовал, у него нет проблем с компиляцией или запуском, он просто печатает 1 – Sam

ответ

3

, когда выбрано NullPointerException, почему он не прекращает нить, как я ожидал?

Поскольку нить не прекращается, если исключение не распространяется на цепочку вызовов.

Я думал, что не было блока catch try в том же методе, это вызовет исключение и остановит программу.

Это не тот же самый метод, что это в любом из способов по цепочке вызова - в этом случае, main перехватывает исключение, предотвращая нить от завершения.

2

Вы поймаете исключение в своем основном методе. Ваша версия просто игнорирует это, версия ниже будет печатать исключение ...

public static void main(String args[]) { 
    try { 
     m(); 
    } catch (Exception e) { 
     System.out.println("You are catching: " + e); 
    } 
    System.out.println(s); 
} 

Если вы хотите, чтобы программа прекратить, не поймать исключение, как в примере ниже:

public static void main(String args[]) { 
    m(); 
    // never reached 
    System.out.println(s); 
}