Java如何从try,catch和最后返回一个值?

因此,当我在“try {}”中执行块代码时,我尝试返回一个值,它会出现“无返回值”。 这是我使用的代码,代表我的问题。

import org.w3c.dom.ranges.RangeException; public class Pg257E5 { public static void main(String[]args) { try { System.out.println(add(args)); } catch(RangeException e) { e.printStackTrace(); } finally { System.out.println("Thanks for using the program kiddo!"); } } public static double add(String[] values) // shows a commpile error here that I don't have a return value { try { int length = values.length; double arrayValues[] = new double[length]; double sum =0; for(int i = 0; i<length; i++) { arrayValues[i] = Double.parseDouble(values[i]); sum += arrayValues[i]; } return sum; // I do have a return value here. Is it because if the an exception occurs the codes in try stops and doesn't get to the return value? } catch(NumberFormatException e) { e.printStackTrace(); } catch(RangeException e) { throw e; } finally { System.out.println("Thank you for using the program!");// so would I need to put a return value of type double here? } } } 

基本上,我遇到的问题是“当你使用try和catch块时,你如何返回一个值?

要在使用try/catch时返回值,可以使用临时变量,例如

 public static double add(String[] values) { double sum = 0.0; try { int length = values.length; double arrayValues[] = new double[length]; for(int i = 0; i < length; i++) { arrayValues[i] = Double.parseDouble(values[i]); sum += arrayValues[i]; } } catch(NumberFormatException e) { e.printStackTrace(); } catch(RangeException e) { throw e; } finally { System.out.println("Thank you for using the program!"); } return sum; } 

否则,您需要在没有throw每个执行路径(try block或catch block)中返回。

这是因为你是一个try语句。 由于可能存在错误,因此可能无法初始化sum,因此将return语句放在finally块中,这样肯定会返回。

确保在try/catch/finally之外初始化sum以使其在范围内。

问题是当你抛出NumberFormatexception时会发生什么? 你打印它并且什么也不返回。

注意:您不需要捕获并抛出exception。 通常用它来包装它或打印堆栈跟踪并忽略例如。

 catch(RangeException e) { throw e; } 

这是另一个使用try / catch返回布尔值的示例。

 private boolean doSomeThing(int index){ try { if(index%2==0) return true; } catch (Exception e) { System.out.println(e.getMessage()); }finally { System.out.println("Finally!!! ;) "); } return false; }