因此,当我在“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阻止时,你如何返回一个值?
答案 0 :(得分:22)
要在使用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)中返回。
答案 1 :(得分:2)
这是因为你在try
声明中。由于可能是一个错误,总和可能未初始化,因此将您的return语句放在finally
块中,这样肯定会返回它。
确保在try/catch/finally
之外初始化总和,使其在范围内。
答案 2 :(得分:1)
问题是你被NumberFormatexception
抛出后会发生什么?你打印它并且什么也不返回。
注意:您不需要捕获并抛出异常。通常用它来包装或打印堆栈跟踪并忽略例如。
catch(RangeException e) {
throw e;
}
答案 3 :(得分:1)
这是另一个使用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;
}