首页 文章

尝试使用空的finally块进行阻止

提问于
浏览
0

当我们有一个没有任何代码的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 回答

  • 3

    使用 try-finally 语句而不声明 catch 语句是合法的 .

    来自JLS

    14.20.2 . 执行try-finally和try-catch-finally通过首先执行try块来执行带有finally块的try语句 . 然后有一个选择:如果try块的执行正常完成,则执行finally块,然后有一个选择:如果finally块正常完成,则try语句正常完成 . 如果finally块因原因S突然完成,则try语句突然完成,原因是S.

    你说 :

    我们既没有捕获异常也没有清理finally块中的代码 . 如果是这样,为什么JAVA没有考虑对此进行编译时检查?

    你在 finally 声明中所写的内容当然是由开发人员掌握的 .
    有一个空的 finally 语句是没用的,但是有一个空的 iffor 语句也是一样的 .
    这些是无助的,但编译器不会抱怨它,因为它在编译方面保持有效的代码 .
    但是,IDE可能会发出有关它的警告以指出难闻的气味 .

  • 2

    要添加一些上下文,最后只需要使用keyword / label来标识链接到 try 的块语句 . 它就像在 try 中调用的 goto .

    每个块语句都可以为空 .

    if(true){}
    --
    while(true){}
    --
    public void method(){}
    

    即使这是有效的

    public void method(){
        {}
    }
    

    所以,我们可以说编译器不关心那些内容,只关注它中的语法 .

  • 0

    由于您在 try-catchtry-finally 语句中包含了抛出异常的代码,因此编译器知道您处理了潜在的错误 . 你用它做什么取决于你,它被授权忽略它 .

    你可以争辩说:“ How is that different than no try at all? ” . 不同之处在于,如果您没有将它放在 try 子句中,编译器就无法知道您是故意这样做了还是忘了它 .

    基本上,捕获异常是强制性的,但处理它不是 .

相关问题