[英]Java: I have try,catch and finally in a java code and I want after try or catch block finally does not execute
[英]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);
star
, planet
等的范圍僅限於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.