簡體   English   中英

使用try / catch進行最終變量分配

[英]Final variable assignment with try/catch

因為我相信這是一個良好的編程習慣,我把我所有的(本地或實例變量) final ,如果他們的目的是只能寫入一次。

但是,我注意到,當變量賦值可以引發異常時,您不能將所述變量定為最終變量:

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
}

有沒有辦法不用臨時變量來做到這一點? (或者這不是最終修飾符的正確位置嗎?)

一種實現方法是引入(非final )臨時變量,但是您說您不想這樣做。

另一種方法是將代碼的兩個分支都移到一個函數中:

final int x = getValue();

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

這是否可行取決於確切的用例。

總而言之,只要x是一個適當范圍內的局部變量,最實際的通用方法可能是使其不為final

另一方面,如果x是成員變量,我的建議是在初始化期間使用非final臨時變量:

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 and catch塊中有1條以上的語句,第一個語句是:x =42。在其他語句之后,try塊失敗了,然后轉到catch塊,在此處假設x =30。現在您定義了x兩次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM