如何避免Java编译错误“局部变量可能尚未初始化”?(是的,很认真!)

彼得罗·布雷恩(Pietro Braione)

在您说这个问题已经被无数次回答之前,这是我的代码片段:

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
彼得·珍妮切克(PetrJaneček)

通过向编译器提供一些额外的信息来欺骗一些用户:

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发生某种变化(仅从语法上讲,它当然永远不会返回),然后调用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");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何避免“局部变量可能尚未初始化”?

局部变量可能尚未初始化

局部变量 dMetres 可能尚未初始化

如何避免MSVC警告C4701:可能未初始化的局部变量

由于尝试捕获多个异常而出现错误“局部变量年龄可能尚未初始化”

Java,如何避免“可能尚未初始化”

我的 java 代码不起作用,因为“局部变量尚未初始化”

变量可能尚未初始化错误

变量可能尚未初始化?错误

Java错误“变量可能尚未初始化”

Java 错误:变量 playerClass 可能尚未初始化

java:从内部类内部访问局部变量循环器;需要声明为final,但随后变量可能尚未初始化

如何关闭“ java:变量可能尚未初始化”

避免“变量可能尚未初始化”的最佳实践

不可变类中的编译时错误:(最终)变量可能尚未初始化

编译器错误“变量x可能尚未初始化”的含义是什么?

了解局部变量初始化

局部变量初始化

Bash局部变量初始化

线程局部变量的初始化

TASM初始化局部变量

如何避免使用System.exit尝试/捕获附近的“变量可能尚未初始化”

如何使用字段或局部变量初始化Java中的对象?

Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

java变量范围,变量可能尚未初始化

错误:变量c可能尚未初始化

Java:变量的捕获异常可能尚未初始化

变量可能尚未初始化...如何增加范围?

切换局部变量编译错误