[英]Method return statement vs try-catch
据我所知,Java 错误可以通过两种方式报告:返回值和异常。
例如,下面的代码:
int methodName(int i, int j) {
int result;
try {
result = i / j;
return result;
// in the case of j = 0, ArtithmeticException() will be thrown
}
catch (Exception e) {
System.out.println("Some message");
}
//return result;
}
在j = 0
的情况下,将抛出并捕获异常(通过 catch),并打印“Some message”。
问题是:如果我不想在除以零的情况下从此方法返回任何结果,我必须返回一些值还是有其他方法? 即在 catch 子句中使用“抛出”?
另一个观察结果:如果我取消注释最后一个“返回结果”语句,我会收到错误消息:
变量结果可能尚未初始化
如果我最后评论“返回结果”,我会收到错误消息:
缺少退货声明
但是我已经在 try 子句中包含了 return 语句。
谢谢!
在 j = 0 的情况下,将抛出并捕获异常(通过 catch)。 并且将打印消息。 问题是:如果我不想在除以零的情况下从此方法返回任何结果,我仍然必须返回一些值还是有其他方法? 使用 catch 子句中的“抛出”?
您必须返回与签名匹配的值(在本例中为int
)或throw
一些东西,否则程序将无法编译。
还有另一个观察:如果我取消注释最后一个
return result
语句,我会收到一条错误消息:变量结果可能尚未初始化
result
变量在try
块中分配。 编译器不知道异常可能发生的确切时间。 如果在赋值完成之前发生异常,那么在return result
语句的那一刻,变量result
可能没有值。 解决方案是在try
块之前设置一个值。
如果我最后评论“返回结果”,我会收到一条错误消息:缺少返回语句但我已经在 try 子句中包含了返回语句。
在本例中,如果try
块中发生异常,则执行catch
块和函数体的其余部分,并且没有其他return
语句与方法的签名相匹配。 您必须在所有执行路径上返回一个int
值。
您想要实现的可以通过以下示例代码实现
由于 ArithmeticException 是 RuntimeException 并且在 j=0 的情况下,异常将传播到调用者函数。
int methodName(int i, int j) {
return i/j;
}
也许是这样的:
static int methodName(int i, int j) {
if (j == 0) throw new ArithmeticException();
return i/j;
}
您还可以使用 Integer 类型作为结果并将其初始化为 null 并且您的代码将编译:
Integer result = null;
无论哪种方式,调用代码都需要处理异常或可能的空值。
您可能正在观察的一件事是变量的scope
。
当一个人想要调用一个void
方法以便它return
什么都不行时; 然而,仍然让它改变一个变量的值,可以把他们想要改变的变量放在全局范围内。
下面的演示是一个示例:
public class MyClassName{
//global scope int
public static int result;
//main method
public static void main(String[] args){
//Let's see what we start at
System.out.println("By default im at: " + result);
//Attempt to set global variable as the result of a 0 division
methodName(1,0);
System.out.println("I tried to divide by zero but I'm still at: "+result);
//Attempt to perform normal calculation 25/5
methodName(25, 5);
System.out.println("25 divided by 5 is: "+result);
}
//method that changes global variable - void means it returns nothing
public static void methodName(int i, int j) {
try {
//try 1 / 0
result = i / j;
}
catch (Exception e) {
System.out.println("CATCH:I failed to divide by zero.");
}
}
}
输出:
By default im at: 0
CATCH:I failed to divide by zero.
I tried to divide by zero but I'm still at: 0
25 divided by 5 is: 5
请注意全局变量在 main 方法之外的位置。 在这个例子中,变量result
的值仍然改变了,但不一定是return
ed。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.