用try / catch最后一个variables赋值

因为我相信这是一个很好的编程习惯,所以我把所有的(本地或者实例)variables都写成final如果它们只能被写入一次的话。

但是,我注意到,当一个variables赋值可以抛出一个exception,你不能做出最后的variables:

 final int x; try { x = Integer.parseInt("someinput"); } catch(NumberFormatException e) { x = 42; // Compiler error: The final local variable x may already have been assigned } 

有没有办法做到这一点,而不诉诸临时variables? (或者这不是最终修饰符的正确位置?)

一种方法是引入一个(非final )临时variables,但是你说你不想这样做。

另一种方法是将代码的两个分支移动到一个函数中:

 final int x = getValue(); private int getValue() { try { return Integer.parseInt("someinput"); } catch(NumberFormatException e) { return 42; } } 

这是否实际取决于确切的用例。

总而言之,只要x是一个适当范围的局部variables,最实际的一般方法可能就是使它不是final

另一方面,如果x是一个成员variables,我的build议是在初始化期间使用非final临时variables:

 public class C { private final int x; public C() { int x_val; try { x_val = Integer.parseInt("someinput"); } catch(NumberFormatException e) { x_val = 42; } this.x = x_val; } } 

不,它不是正确的地方,想象你在try和catch块中得到了更多的1语句,第一个语句说:x = 42。在其他一些语句之后,try块失败,并且它进入catch块,说x = 30.现在你定义了x两次。