当我们有一个没有任何代码的try块终于被阻塞时,编译器可以很好地编译它 . 但是,这里没有尝试的目的 - 因为我们既没有捕获异常也没有清理finally块中的代码 .
public int updateTable(InputVo sfVo){
//SqlSession session = ConnFactory.getSqlSession();
//InputMapper spMapper = session.getMapper(InputMapper .class);
int updRecs=0;
try {
mapper.updateData(sfVo);
updRecs=sfVo.getRecsUpdated();
return updRecs;
} finally {
//session.close();
}
}
如果是这样,为什么JAVA没有考虑对此进行编译时检查?
如果编译器在编译时抛出错误本身就不会更好 - 比如“不能有一个空的finally块”
3 回答
使用
try-finally
语句而不声明catch
语句是合法的 .来自JLS:
你说 :
你在
finally
声明中所写的内容当然是由开发人员掌握的 .有一个空的
finally
语句是没用的,但是有一个空的if
或for
语句也是一样的 .这些是无助的,但编译器不会抱怨它,因为它在编译方面保持有效的代码 .
但是,IDE可能会发出有关它的警告以指出难闻的气味 .
要添加一些上下文,最后只需要使用keyword / label来标识链接到
try
的块语句 . 它就像在try
中调用的goto
.每个块语句都可以为空 .
即使这是有效的
所以,我们可以说编译器不关心那些内容,只关注它中的语法 .
由于您在
try-catch
或try-finally
语句中包含了抛出异常的代码,因此编译器知道您处理了潜在的错误 . 你用它做什么取决于你,它被授权忽略它 .你可以争辩说:“ How is that different than no try at all? ” . 不同之处在于,如果您没有将它放在
try
子句中,编译器就无法知道您是故意这样做了还是忘了它 .基本上,捕获异常是强制性的,但处理它不是 .