java - java字节码不是顺序执行的吗?

标签 java static-members

我期望以下代码在设置静态变量值的语句之前打印行,但它没有按预期工作。

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(); 
    }
}
}

输出抛出异常“银行处于危机中”,但它应该首先打印一些行“收集现金...”消息,然后抛出异常消息...

最佳答案

问题是你的PrintWriter永远不会被刷新。它正在积累数据,但它永远不会将其写入控制台,因为在缓冲区已满之前抛出异常。

如果您在引发异常的调用之前调用 writer.flush(),您将看到预期的消息。

如果您在finally block 中关闭编写器,您将在关闭时看到数据,因为这也会刷新编写器...但是异常之后,如catchfinally 之前执行。

如果您使用 try-with-resources block ,您将看到异常之前的数据,因为close有效地发生在“嵌套”尝试/最终中:

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

关于java - java字节码不是顺序执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727703/

相关文章:

java - 尝试在 Android Studio 中读取 JSON 文件时出现 "FileNotFoundException"

java - 无法在 Android 上使用 HttpURLConnection 将数据发布到站点

java - 我无法解决尝试在空对象引用上调用虚拟方法 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()'

java - 如何在 Jasper Report 中将横向格式的 PDF 文件附加为面板格式?

c++ - 为什么初始化对象的两种不同方式给出不同的输出

java - 如何验证页面上的所有元素?

c++ - 静态回调函数和非静态成员

c++ - 模板的私有(private)静态变量成员的 undefined symbol

c++ - 在实例的构造函数中初始化静态成员

c++ - 返回类的私有(private)静态成员