返回try catch';在java中,最后是块。这个例子有什么好处吗?

返回try catch';在java中,最后是块。这个例子有什么好处吗?,java,try-catch,Java,Try Catch,我不熟悉java,最近我一直在看一些同事编写的代码,这让我感到困惑。以下是它的要点: public response newStuff(//random data inside) { try { response or = //gives it a value log.info(or.toString()); return or; } catch ( Exception e) { e.printStackTrace

我不熟悉java,最近我一直在看一些同事编写的代码,这让我感到困惑。以下是它的要点:

public response newStuff(//random data inside) {
    try {
       response or = //gives it a value
       log.info(or.toString());
       return or;
    }
    catch ( Exception e) {
        e.printStackTrace();
    }
    finally {
        return null;
    }
}

在这里添加finally块真的有意义吗?我不能在catch块中添加return null,这将执行相同的行为,还是我错了?

无论发生什么情况,
最终都会执行,并且通常可以用于关闭会话等。

不要将回报放在finally块中。

这看起来是一种非常糟糕的做法。在这种情况下,代码将始终返回
null

finally
块在
try catch
块运行后最后调用。无论是
try
完成还是调用了
exception
块。在这种情况下,无论运行哪条代码路径,都将始终返回null。 在“正常”情况下,如果将
返回null
放在finally之后,则确实有机会返回某些内容(无论是从
try
还是从
catch
块),如果没有流生成返回对象,则返回到
返回null
,但并不总是返回null。

finally无论“捕获”是否触发,块都将执行。因此,这种行为与在Catch块中放置“returnnull”不同

在这里添加finally块真的有意义吗

答案是响亮的“否”:在
finally
块中放入
return
语句是一个非常糟糕的主意

我只是在catch块中添加了returnnull,这将执行相同的行为,还是我错了

它与原始行为不匹配,但这是一件好事,因为它可以修复它。与原始代码那样无条件返回
null
不同,在
catch
块中带有
return
的代码只会在出现错误时返回
null
。换句话说,
try
分支中返回的值将返回给调用方,除非出现异常

此外,如果在
catch
块之后添加
returnnull
,您将看到异常时返回
null
的正确效果。我会更进一步,在方法中添加一个
return
,如下所示:

response or = null;
try {
   or = //gives it a value
   log.info(or.toString());
} catch ( Exception e) {
    e.printStackTrace();
}
return or;
public Result newStuff() {
    Result res = null;
    try {
       res = someMethod();
       log.info(res.toString());
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        return res;
    }
}

finally块中不应有
return
语句,删除
return

最终块的需要是,当您有这样一个代码时,应该始终执行它,比如您想要关闭输入流或您想要关闭任何连接等。只要在谷歌上搜索一下,您就会很容易找到这方面的示例

在您的例子中,您正在编写一个方法,其中在try块中返回某些内容,最后在finally块中返回null。我在这里看不到finally块的任何用途。

实际上,没有。finally(几乎)总是运行,无论try-catch块中的结果如何;所以这个块总是返回
null
。在这里,看看这个例子:

public class Finally {

/**
 * @param args
 */
public static void main(String[] args) {
    System.out.println(finallyTester(true));
    System.out.println(finallyTester(false));
}

public static String finallyTester(boolean succeed) {
    try {
        if(succeed) {
            return "a";
        } else {
            throw new Exception("b");
        }
    } catch(Exception e) {
        return "b";
    } finally {
        return "c";
    }
  }

}
它将两次打印“c”


上述规则的例外情况是线程本身被中断;e、 g.通过
System.exit()
。然而,这种情况很少发生。

如果要执行某些语句,即使try块或catch块中的代码是否生成异常,也可以使用Finally块。但当您在try块中使用return时,将return放在finally块中并没有任何意义。您可以直接从catch block返回,并可以删除finally block。

首先了解为什么初学者需要这三个块

1) try block:如果您怀疑您的代码是否会导致异常,请将其放入try block

2) catch块:若出现异常,那个么需要执行的一段代码应该写在这个块中

3) finally block:如果您希望您的代码段被执行,不管是否出现异常,那么我们选择finally block。此块主要用于释放资源。 例如:

try{
   Connection conn=//something;
   //some code for database operations

}catch(SQLException e){
        e.printStackTrace()
}finally{
      conn=null;
}
无论结果如何,您都必须将连接设为null,因为它是一个重对象,若被引用,将在数据库上创建负载,因为只有很少的连接对象可用。 所以,最好的办法是让他们在最后块


在您的情况下,在finally块中返回null是一种不好的方法,因为它总是返回null,尽管是否出现异常。

我读到很多人只是简单地回答“不要在finally块中使用
返回”
,没有任何解释。实际上,您发布的代码是一个很好的例子,其中
finally
块中的
返回导致了大量混乱。甚至在撰写本文时,也弄错了。您的代码将始终执行
返回null作为最后一个命令

但是我可以想到一种情况,在
finally
块中的
返回实际上是有意义的。在我看来,代码作者的目标是方法从不抛出
Throwable
,而是返回
null
。如果您这样修改代码,实际上可以实现这一点:

response or = null;
try {
   or = //gives it a value
   log.info(or.toString());
} catch ( Exception e) {
    e.printStackTrace();
}
return or;
public Result newStuff() {
    Result res = null;
    try {
       res = someMethod();
       log.info(res.toString());
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        return res;
    }
}

但是请注意,这不会调用
printStackTrace()
Error
s和
Throwable
s,它们不是
Exception
s。

哦,不要将
return
语句放在
finally
块中。请。您的代码将始终返回
null
。将
return
放入
catch
与将其放入
finally
@nhgrif finally始终执行,无论您是否捕获到期望。这个方法不经过最后一步就无法返回,我很奇怪Java、JavaScript、Python的设计者,