Java:如何结合return使用try/catch块及改造代码捕获异常
一、Java中try/catch块与return关键字的结合使用
在Java里,try、catch、finally和return搭配的时候有几个实用的规则,我给你掰扯明白:
- try块里的return:如果try块里写了return,JVM会先执行return之前的所有逻辑,把要返回的值临时存起来,接着去执行finally块(如果有的话),最后才返回那个暂存的值。要注意的是,如果finally块里也写了return,那会直接覆盖try块的返回值,try块的return就失效了,所以尽量别在finally里写return,很容易踩坑。
- catch块里的return:和try块的逻辑类似,catch捕获异常后执行return的话,同样会先暂存返回值,再执行finally块(如果存在),最后返回结果。同样要避开finally里写return的坑。
- finally块的优先级:不管try或catch里有没有return,finally块都会被执行(除非遇到
System.exit()这种直接终止JVM的操作)。
举个直观的例子:
public static int testReturn() { try { System.out.println("执行try块"); return 1; } catch (Exception e) { return 2; } finally { System.out.println("执行finally块"); // 这里如果写return 3,最终返回的就是3,而不是1 } }
调用这个方法会先打印执行try块,接着打印执行finally块,最后返回1。如果finally里加了return 3,那最终返回值就变成3了。
二、修改代码处理空LinkedList的异常
原代码里当LinkedList为空时,调用list.getLast()会抛出NoSuchElementException,我们可以给这个操作套上try/catch块,捕获异常后把信息输出到控制台,同时还要保证方法能返回合法的double值(比如用Double.NaN表示异常场景)。
修改后的代码如下:
import java.util.Collections; import java.util.LinkedList; import java.util.NoSuchElementException; double foo(double[] numbers, double n) { LinkedList<Double> list = new LinkedList<Double>(); for (double x : numbers) { if (x > 0 && x <= n && x % 2 != 0) { list.add(x); } } Collections.sort(list); try { return list.getLast(); } catch (NoSuchElementException e) { // 输出自定义异常提示到控制台 System.err.println("异常提示:LinkedList为空,无法获取最后一个元素"); // 打印完整异常堆栈,方便排查问题 e.printStackTrace(); // 返回一个表示异常的数值,NaN代表非数字,符合无有效结果的场景 return Double.NaN; } }
简单解释下:
- 把
list.getLast()放到try块里,一旦列表为空触发异常,就会被catch块捕获。 - 用
System.err.println()输出友好的提示信息,再调用e.printStackTrace()打印完整的异常堆栈,方便定位问题。 - 因为方法必须返回double类型,所以返回
Double.NaN来标记这次调用因为异常没有得到有效结果,你也可以根据业务需求改成0.0或者其他合适的值。
内容的提问来源于stack exchange,提问作者jdoe
相关产品推荐
相关产品推荐

