Java 为什么编译带有catch异常的空try块?

Java 为什么编译带有catch异常的空try块?,java,exception,Java,Exception,不带任何代码的试一下块: try { } catch (Exception ex) { // what Exception it is catching ex.printStackTrace(); } 没有任何代码意味着不可能抛出异常,那么为什么不给出一个“不可访问的catch block”编译错误呢?这是有效的Java语法。这与有一个空的if块相同: if (condition) { } 。。。或定义空方法: public void empty() { } 。。。或

不带任何代码的
试一下
块:

try {

} catch (Exception ex) {
    // what Exception it is catching
    ex.printStackTrace();
}

没有任何代码意味着不可能抛出异常,那么为什么不给出一个“不可访问的catch block”编译错误呢?

这是有效的Java语法。这与有一个空的if块相同:

if (condition) {

}
。。。或定义空方法:

public void empty() {

}
。。。或仅作为正文的一部分发表评论:

try {
  // try body
} catch (Exception e) {
  // catch body
}

所有这些都是有效的语法,因此编译器很高兴。此外,由于空行/空正文完全可以,因此在运行时,
try
块的正文中不会抛出异常,因此代码也可以正常执行。

Exception
包括
RuntimeException
s,它们是未选中的,不需要声明,因此,
异常
总是可以被有效捕获


我认为这是一个不重要的边缘案例。

因此我假设您的问题是什么异常会被捕获,而答案是“无”。只有在try块中运行代码时抛出异常,才会捕获异常。然后,它将检查该异常是否被捕获(仅供参考,异常将捕获所有异常),如果是,它将在catch块内处理该异常,否则将导致错误。由于try块中没有任何内容,因此将永远不会捕获异常,因为无法引发任何异常。

您能在此处为我们提供更多详细信息吗?你是如何编译这段代码的?您是否在Eclipse或IntelliJ等IDE中工作?此代码是否位于
.java
源文件中?为什么不应编译?一个完全空的java文件也会编译。为什么会有问题?它只是一个块,如果你不想写代码,这取决于你。编译器检查错误,你没有任何错误。没有编译错误,必须编译。因为在你的
try
block no error中,我认为关键是从技术上讲
Exception
不能从任何代码中抛出,所以应该有一个“catching unthrown Exception”编译错误。如何从空块中抛出
RuntimeException
?@fast see duplicate(我刚刚发现)想从传说中得到更完整的答案