java - catch 块中的 throw 语句如何防止未初始化变量的编译器错误?
问题描述
我试图弄清楚这段代码的内部工作原理。
public void method() {
int x;
try {
x = 10;
} catch(Exception e) {
throw new RuntimeException(); //commenting out this line causes error
}
System.out.println("x: " + x);
}
当我注释掉第 6 行时,我在第 8 行收到一个编译错误,表明 x 可能尚未初始化。当我将 throw 语句保留在 catch 块中时,我没有收到这样的错误。这有什么区别?在我看来,您可以在 try 块内初始化一个变量并在外部使用该值,或者您不能。无论如何,实际上不会抛出异常,因为从未进入 catch 块。当然,仅仅抛出异常的可能性并不会导致编译器允许违反 Java 语法的行为,对吧?
解决方案
我不能说是否有任何真正的异常可能发生在try
-可能会发生,但不会被抓住- 但我相信这只是由于编译器格外小心(也许是不必要的)。OutOfMemoryError
catch (Exception e)
块内的行try
不引发异常无关紧要。相反,它正在评估如果在语句中(以某种方式)抛出异常try
并且随后允许执行继续超过该catch
子句,则将x
处于未初始化状态。
确切的答案很可能隐藏在 Java 语言规范中,可能在14.21 中。无法访问的语句或14.20.1。执行 try-catch。
推荐阅读
- sql - 如何在bigquery中连续显示平均值而不是null?
- php - 使用 ajax jquery php 和 mysql 制作账单
- python - 仅在 Python 中显示相关的时间单位
- excel - Excel 数组覆盖,需要追加
- android - 找不到包含 /data/data/com.company.app/files 的已配置根目录
- javascript - Javascript中的对象属性降序
- c# - 多个内部应用程序集中身份/身份验证的最佳实践
- activemq-artemis - Artemis 主服务因 IO 错误而关闭
- python - 在 Python 中使用 Regex 在文本中的阿拉伯语(波斯语)和英语单词之间插入逗号
- apache-spark - 无法使用 Spark 脚本将 Spark 数据集写入 HBase