方法return语句vs try-catch

时间:2017-12-09 06:29:59

标签: java methods return 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)。并打印消息。 问题是:如果我不想在除以零的情况下从这个方法返回任何结果,我仍然必须返回一些值或者还有另一种方法吗?使用catch子句中的'throw'?

另一个观察结果:如果我取消注释最后'返回结果'语句,我收到一条错误消息:
变量结果可能尚未初始化
如果我评论最后'返回结果',我收到一条错误消息:

  

缺少退货声明

但我已经在try子句中包含了return语句。

感谢。

4 个答案:

答案 0 :(得分:2)

  

如果j = 0,将抛出异常并捕获(通过catch)。并打印消息。问题是:如果我不想在除以零的情况下从这个方法返回任何结果,我仍然必须返回一些值或者还有另一种方法吗?使用catch子句中的'throw'?

您必须返回与签名(本例中为int)或throw匹配的值,否则程序将无法编译。

  

另一个观察结果:如果我取消注释上一个return result语句,我收到一条错误消息:   变量结果可能尚未初始化

result块中分配了try变量。 编译器不知道可能发生异常的确切位置。 如果在分配完成之前发生异常, 然后在return result陈述点, 变量result可能没有值。 解决方案是在try块之前设置一个值。

  

如果我评论最后'返回结果',我收到一条错误消息:   缺少退货声明   但是我已经在try子句中包含了return语句。

在此示例中,如果try块中发生异常, 然后执行catch块和函数体的其余部分, 并且没有其他return语句来匹配方法的签名。 您必须在所有执行路径上返回int值。

答案 1 :(得分:1)

您希望通过以下示例代码实现您想要实现的目标

  

由于ArithmeticException是RuntimeException,并且在j = 0的情况下,异常将传播到调用函数。

int methodName(int i, int j) {
                    return i/j;
               }

答案 2 :(得分:1)

也许是这样的:

  static int methodName(int i, int j) {
    if (j == 0) throw new ArithmeticException();
    return i/j;
  }

你也可以使用Integer类型作为结果并将其初始化为null,你的代码将编译:

Integer result = null;

无论哪种方式,调用代码都需要处理异常或可能的空值。

答案 3 :(得分:0)

您可能观察到的一件事是变量的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

请注意主要方法之外的全局变量的定位。 在此示例中,变量result的值仍然更改,但不一定是return