2013-09-10 2 views
0

Я ожидаю, что следующий код напечатает строки перед оператором, в котором статическое значение переменной установлено, но оно не работает должным образом.Не работает ли java-байт-код последовательно?

import java.io.PrintWriter; 
class Bank{ 
private static boolean isInCrisis = false; 
public static boolean getIsInCrisis(){return Bank.isInCrisis;} 
public static boolean setIsInCrisis(boolean crisis){ 
    return Bank.isInCrisis = crisis; 
} 
public String getCash() throws Exception{ 
    if(!Bank.isInCrisis){ 
     return new String("$100"); 
    } 
    else{ 
     throw new Exception("Bank is in crisis"); 
    } 
} 
} 

public class InstanceObjects{ 
public static void main(String... st) { 
    try{ 
     Bank hsbc = new Bank(); 
     PrintWriter writer = new PrintWriter(System.out); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     hsbc.setIsInCrisis(true); 
     writer.printf("collect cash: %s\n",hsbc.getCash());    
     writer.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
} 

выход бросает исключение «Банк находится в кризисе», но он должен сначала напечатать несколько строк «собирать наличные ...» сообщение и сообщение об исключении ... забросил

+0

Пожалуйста включите всю трассировку стеки и указать оператор в 'основные()', где исключение (должно быть второй 'at' линией). –

+0

@mabbas, а как насчет сообщений printf чуть выше 'hsbc.setIsInCrisis (true)'? выход должен быть следующим: собрать наличные 100 долларов США, .... исключение поймано .... банк находится в кризисе ... –

+0

java.lang.Exception: Банк находится в кризисе \t at Bank.getCash (InstanceObjects.java: 13) \t at InstanceObjects.main (InstanceObjects.java:31) –

ответ

5

Проблема заключается в том, что ваш PrintWriter никогда не сбрасывается. Он накапливает данные, но никогда не записывает их на консоль, потому что исключение создается до того, как его буфер заполнен.

Если вы вызываете writer.flush() перед вызовом, который генерирует исключение, вы увидите ожидаемые сообщения.

Если закрыть писатель в конце концов блока вы увидите данные, когда она закрыта, как промывает писатель тоже ... но после исключения, поскольку catch выполняются перед finally.

Если вы используете try-with-resources блок вместо этого, вы увидите данные перед тем исключение, потому что там close происходит в «вложенная» попробовать /, наконец, эффективно:

try (PrintWriter writer = new PrintWriter(System.out)) { 
    Bank hsbc = new Bank(); 
    ... 
} catch(Exception e){ 
    // writer will already be closed here 
    e.printStackTrace(); 
} 
+0

получил его! благодаря, –

0

Вы забыли

writer.flush();

метод printf не автоматический поток, ваши сообщения сидят в буфере, который никогда не передается в консоль.

0

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

public class Main{ public static void main(String... st) { 
    try{ 
     Bank hsbc = new Bank(); 
     PrintWriter writer = new PrintWriter(System.out); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.printf("collect cash: %s\n",hsbc.getCash()); 
     writer.flush(); 
     hsbc.setIsInCrisis(true); 
     writer.printf("collect cash: %s\n",hsbc.getCash());    
     writer.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } } } 

Печать:

collect cash: $100 
collect cash: $100 
collect cash: $100 
collect cash: $100 
collect cash: $100 
collect cash: $100 
collect cash: $100 
java.lang.Exception: Bank is in crisis 
    at Bank.getCash(Main.java:13) 
    at Main.main(Main.java:32) 
Смежные вопросы