Finally块在Java中不会设置变量的值。

13 浏览
0 Comments

Finally块在Java中不会设置变量的值。

我有以下代码。\n

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            System.out.println("Hardik::"+testFinnalyBlock());  
        }catch(Exception e){
            System.out.println("hhh");
        }
    }
    public static int testFinnalyBlock() throws Exception{
        int a=5,b=10;
        int sum=0;
        try{
            sum = a+b;
            System.out.println("sum==="+sum);
            return sum;
        }catch(Exception e){
            System.out.println("In Catch");
        }finally{
            sum = a+30;
            System.out.println("sum==="+sum);
//          return 1;
        }
        return 1;
    }

\n以上代码的输出是Hardik::15,\n然而我认为它应该是Hardik::35。\n有人能告诉我它是如何工作的吗?\n谢谢。

0
0 Comments

在Java中,finally块用于在try-catch块中的代码执行完毕后执行一些必要的清理工作,无论是否发生异常。然而,在某些情况下,finally块可能无法设置变量的值,导致程序出现问题。

在给定的代码示例中,问题出现在finally块中尝试设置sum变量的值。由于在try块中存在return语句,当程序执行到该return语句时,会立即返回并停止执行,无法继续执行finally块中的代码。因此,sum变量无法被正确设置,并且可能会导致输出不符合预期。

要解决这个问题,可以将return语句从try块中移除。这样,程序将继续执行finally块中的代码,并设置sum变量的值。以下是修改后的代码示例:

try{
   sum = a+b;
   System.out.println("sum===" + sum);
}
catch(Exception e){
   System.out.println("In Catch");
}
finally{
   sum = a+30;
   System.out.println("sum===" + sum);
}
return sum;

通过这种修改,finally块中的代码将能够正确设置sum变量的值,并且程序的输出将符合预期。这是因为现在程序能够顺利执行finally块中的代码,而不会被提前的return语句中断。

0
0 Comments

Finally块不会在Java中设置变量的值的原因是因为finally块中的代码在try或catch块中的代码执行完之后才会执行,无论是否发生异常。因此,如果在finally块中设置变量的值,它们将覆盖在try或catch块中设置的值。

解决这个问题的方法是将需要在finally块中设置的变量的值赋给另一个变量,然后在finally块之后返回那个变量的值。这样可以确保在finally块中设置的值不会覆盖在try或catch块中设置的值。

下面是修改后的代码示例:

public static int testFinallyBlock() throws Exception{
    int a=5,b=10;
    int sum=0;
    int finallySum = 0;
    try{
        sum = a+b;
        System.out.println("sum==="+sum);
    }catch(Exception e){
        System.out.println("In Catch");
    }finally{
        finallySum = a+30;
        System.out.println("finallySum==="+finallySum);
    }
    return finallySum;
}

通过将finally块中设置的值赋给finallySum变量,并在finally块之后返回finallySum的值,可以确保在finally块中设置的值不会覆盖在try或catch块中设置的值。这样,无论是否发生异常,finally块中的代码都会被执行,并且在方法返回之前设置的值将被返回。这是一种更好的做法,因为finally块应该用于清理活动,而不是用于逻辑操作。

0
0 Comments

finally块根据输出执行了,问题出在try-catch块的return语句。finally块不会更新返回给调用者的值,因为该值已经被放置在另一个内存部分中。

更新:

我是一个相当老派的人,所以我相信方法应该有一个入口点和一个出口点。

以下代码可以产生你想要的结果:

public static int testFinnalyBlock() throws Exception {
    int a = 5, b = 10;
    int sum = 0;
    try {
        sum = a + b;
        System.out.println("sum===" + sum);
    } catch (Exception e) {
        System.out.println("In Catch");
    } finally {
        sum = a + 30;
        System.out.println("sum===" + sum);
    }
    return sum;
}

如果因为错误需要返回不同的值,你应该在try-catch的catch部分修改sum的值。

0