2015-02-27 4 views
1

Привет, может кто-нибудь может отдать эту программу? Я не понимаю, почему вывод _c. Ответ в книге гласит: «Как только s3() выдает исключение из s2(), s2() выдает его в s1(), и не будет больше кода s2().». Почему нет?Java public class Plane

public class Plane { 
    static String s = "_"; 
    public static void main(String[] args) { 
     new Plane().s1(); 
     System.out.println(s); 
    } 
     void s1() { 
      try { s2(); } 
      catch (Exception e) { s += "c"; } 
    } 
     void s2() throws Exception { 
      s3(); s+= "2"; 
      s3(); s+= "2b"; 
    } 
     void s3() throws Exception { 
      throw new Exception(); 
      } 

} 
+1

Не можете ли вы использовать отладчик? Ваша программа не слишком сложна, чтобы вызвать у вас проблемы. –

+0

'Почему бы и нет?' Почему? –

+1

После выполнения в отладчике ответьте * what *, а не * why *. –

ответ

1

Выход «_c», потому что в этом коде:

void s2() throws Exception { 
    s3(); // THIS IS THE LINE THAT THROWS 
    s+= "2"; 
    s3(); 
    s+= "2b"; 
} 

Первая строка, содержащая вызов s3 вызывается, и бросает исключение. Это исключение затем снова бросается в s1 и попадает. Обычно вы не хотите, чтобы код запускался после неконтролируемого исключения, потому что вы получите неопределенное поведение или сбой программы.

2

Первый вызов s3 из s2 вызывает исключение быть выброшен, прежде чем любой из конкатенации происходит в s2, поэтому ни один из струнных дополнений в s2 никогда не будет выполняться. Поэтому единственное дополнение к исходной строке - это то, где это исключение попадает в s1.

1

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

1

Из (раздел 11.3) Java Language Specification

Когда исключение (§14.18), управление передается от кода, который вызвал исключение к ближайшему динамически ограждающих положение улова, если таковые имеются, из Ьги заявления (§14.20), который может обрабатывать исключения

Когда s1() вызывает s2(), первое, что s2() делает это вызов s3(), который генерирует исключение. s2() не может справиться с этим и перебрасывает его в s1(). s1() ловит исключение и добавляет «c» в s.