簡體   English   中英

Java try塊代碼無法執行

[英]Java try block code does not execute

我不明白為什么這個try塊中的代碼無法執行。 我收到一個編譯錯誤,提示我在try塊之后使用這些變量時,它們可能未初始化。

double star, planet, posLife, actLife, intelLife, comm, length;

try{
    star = Double.parseDouble(factor.elementAt(0).getText());    
    planet = Double.parseDouble(factor.elementAt(1).getText());
    posLife = Double.parseDouble(factor.elementAt(2).getText());
    actLife = Double.parseDouble(factor.elementAt(3).getText());
    intelLife = Double.parseDouble(factor.elementAt(4).getText());
    comm = Double.parseDouble(factor.elementAt(5).getText());
    length = Double.parseDouble(factor.elementAt(6).getText());
} catch(NumberFormatException E){ 
    System.err.println("NumberFormatException");
}   

首先,您在try塊中定義的變量不應在try塊外可見; 所以我相信你必須再有double star; 等嘗試之前。

現在,我假定您的代碼更像以下代碼,因為您所說的錯誤不會發生在您提供給我們的代碼中:

double a;
try {
    a = Double.parseDouble(/* blah */);
} catch (NumberFormatException e) {
    System.err.println("NumberFormatException");
}

在此,在執行此代碼塊之后, a可能會完全未初始化。 確實,如果Double.parseDouble發生任何錯誤,將跳過對a的賦值以跳轉到不返回的catch塊。

因此,在上面的代碼塊之后, a可能未初始化,因此出現錯誤消息。

為了解決這個問題,您應該在try塊內的變量之前刪除類型,並在無法解析double的情況下提供默認值,或者,如果無法從此范圍中恢復異常,請不要在其中捕獲它。第一名。

您應該在嘗試訪問雙打之前為其分配默認值,我給我的值是-1

如果需要在try-catch塊之后使用它們,則必須在try塊之前聲明在try-catch中使用的var。

這是一個例子。

//Some default value
double star = -1;

try {
    star = 0;
} catch(NumberFormatException E){ 
    System.err.println("NumberFormatException");
}

//You can use this now.
System.out.println(star);

starplanet等的范圍僅限於try塊。 您需要在try塊之前和外部聲明它們。

double star = null;
try {
  star = Double.parseDouble(...
} catch(NumberFormatException e) {
  ...
}

System.out.println(star);

您提到您已經弄清楚了:“奇怪的是,我還必須在try塊之外初始化變量...”

那不是“奇怪”。 考慮一下此代碼在運行時可以采取的所有可能路徑, 包括特殊路徑。 如果你catch了異常,會發生什么? 程序繼續執行,但不能保證try塊中的任何代碼都已執行 因此,您可能有未初始化的變量。 “可能”是指“一定會”,因為根本不會發生異常這一事實意味着try塊中的某些內容尚未完成執行,因此,至少,您知道該塊中發生的最后一條語句去完成-這意味着length 從未分配

因此,如果發生異常,您將使try塊的length (以及其他length ,可能是double的所有length )未初始化。

還請注意,盡管您的問題詢問為什么try塊中的代碼“不執行”,但您看到的錯誤是編譯錯誤,指出可能未初始化變量。 如果編譯器無法確保變量將被初始化,則會引發此錯誤-並且如果您的初始化代碼位於任何類型的有條件執行的塊中(例如if語句或在這種情況下為try塊),那么,當然編譯器無法確保將始終執行該塊,因此無法保證變量將被初始化!

暫無
暫無

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

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