Finally块在Java中不会设置变量的值。
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谢谢。
在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语句中断。
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块应该用于清理活动,而不是用于逻辑操作。
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的值。