abandonEverythingAndDie

abandonEverythingAndDie

在你说这个问题已经回答了很多次之前,这是我的代码片段:

final int x;
try {
    x = blah();
} catch (MyPanicException e) {
    abandonEverythingAndDie();
}
System.out.println("x is " + x);

如果调用 abandonEverythingAndDie() 具有结束整个程序执行的效果(比如说因为它调用了 System.exit(int) ),那么无论何时使用 x 都会被初始化。

当前的 Java 语言中是否有一种方法可以让编译器对变量初始化感到满意,通过通知它 abandonEverythingAndDie() 是一种永远不会将控制权返回给调用者的方法?

我做 而不是 想要
  • 删除 final 关键字
  • 在声明时初始化 x
  • 也不要将 println 放在 try...catch 块的范围内。
  • 最佳答案

    通过向编译器提供一点额外信息来欺骗一点:

    final int x;
    try {
        x = blah();
    } catch (MyPanicException e) {
        abandonEverythingAndDie();
        throw new AssertionError("impossible to reach this place"); // or return;
    }
    System.out.println("x is " + x);
    

    你也可以让 abandonEverythingAndDie() 返回一些东西(只是在语法上,它当然永远不会返回),然后调用 return abandonEverythingAndDie() :
    final int x;
    try {
        x = blah();
    } catch (MyPanicException e) {
        return abandonEverythingAndDie();
    }
    System.out.println("x is " + x);
    

    和方法:
    private static <T> T abandonEverythingAndDie() {
        System.exit(1);
        throw new AssertionError("impossible to reach this place");
    }
    

    甚至
    throw abandonEverythingAndDie();
    


    private static AssertionError abandonEverythingAndDie() {
        System.exit(1);
        throw new AssertionError("impossible to reach this place");
    }
    

    10-06 09:27