繁体   English   中英

方法返回语句与 try-catch

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM