2015-03-03 72 views
0

一个try块无需任何代码:为什么一个带有catch异常的空try块被编译?

try { 

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

的没有任何代码的含义是抛出异常是不可能的,所以为什么不这样给出一个“无法访问catch块”编译错误?

+2

你能不能给我们一些更详细的在这里?你如何编译这段代码?你在IDE或IntelliJ等IDE中工作吗?此代码是否位于'.java'源文件中? – 2015-03-03 05:46:32

+3

为什么*不应该编译它?一个完全空的java文件也编译。 – Bohemian 2015-03-03 05:48:05

+0

为什么这是什么问题?它只是一个块和高达你,如果你不想写的错误代码.Compiler检查,你不要有任何 – silentprogrammer 2015-03-03 05:48:53

回答

2

这是有效的Java语法。这是同样具有一个空当块:

if (condition) { 

} 

...或定义一个空方法:

public void empty() { 

} 

...或者只是有意见作为身体的一部分:

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

所有这一切是有效的语法,所以编译器是幸福的。此外,由于空白行/空体完全正常,因此在运行时不会有异常情况发生在try块中,因此代码也可以正常执行。

+3

我认为重点在于技术上'Exception'不能从无代码中抛出,所以应该有一个“捕获的可排除异常”编译错误。 – Bohemian 2015-03-03 05:52:25

4

Exception包括RuntimeException s,它们是未选中的并且不需要声明,所以Exception总是可以被有效捕获。

我觉得这是一个不重要的边缘情况。

+0

如何从空块中抛出'RuntimeException'? – fastcodejava 2015-03-03 06:02:26

+1

@fast看到重复(我刚刚找到)从传奇自己更完整的答案 – Bohemian 2015-03-03 06:06:08

1

所以我假设你的问题是什么异常会被抓住,答案是没有。只有在try块内运行代码时抛出异常才会捕获异常。然后它会检查是否捕获到异常(FYI异常会捕获所有异常),如果是,它会在catch块内处理它,否则会导致错误。由于try块中没有任何内容,所以不会捕获异常,因为不会抛出任何异常。