簡體   English   中英

try catch語句的范圍問題

[英]Scope issue on a try catch statement

我有一個關於java的try catch的n00b / basic問題。

Ini myIni;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");

以及后面的錯誤消息: 變量myIni可能尚未初始化

嘗試的范圍僅限於嘗試區域嗎? 如何在以下代碼中獲取myIni的結果?

要避免該消息,您需要在try語句之前設置默認值。
或者您需要將調用放在try語句中的get()方法中。

是的,嘗試的范圍僅限於此。 事實上,范圍以{和以}結尾,因此這也會創建一個子范圍

void foo() {
  {
    Ini  myIni = new Ini(new FileReader(myFile));
  }

  myIni.get("toto"); //error here, since myIni is out of scope
}

要解決您的問題, myIni使用null初始化myIni ,並注意如果嘗試失敗,請myIni.get("toto"); 會導致NullPointerException。

所以你需要考慮到這個或者從catch塊中拋出另一個異常。

檢查為空:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
 }

 if( myIni != null ) {
   myIni.get("toto");
   //access the rest of myIni
 } else {
   //handle initialization error
 }

拋出異常:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
   throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e
 }

 myIni.get("toto");

正如已經@khachik你也可以把try塊周圍的整個使用建議myIni如果可能的話,適當。 您選擇何種解決方案取決於您的其他要求和設計。

以你正確的方式做你想要的是把myIni.get("toto"); try塊內:

try {
    Ini myIni = new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}

不要做Ini myIni = null; 正如一些答案所示。 在這種情況下,如果在myIni初始化時拋出IOException ,則代碼將拋出NullPointerException

嘗試的范圍僅限於嘗試區域嗎? 答案是肯定的。 您遇到的問題是您忘記初始化對象。

試試這個:

Ini myIni=null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

為了避免程序收到NullPointerException ,執行檢查以確保try塊中的被調用導致Object已經構建了一些數據。

if(myIni !=null) 
 {
   myIni.get("toto");
 }

如果您不想在try / catch塊之外調用myIn,則可以選擇,因為如果發生異常,該對象實際上將為null ,那么您可以執行以下操作。

try {
    Ini myIni= new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}

這是編譯器說myIni初始化可能失敗的方式。 因為myIni = new Ini(new FileReader(myFile)); line可能會拋出異常。

如果它到達myIni.get("toto");失敗myIni.get("toto"); myIni不會被初始化。

你有2個選擇:

  1. myIni.get("toto"); try塊內。
  2. 在定義它時為myIni分配初始null值,並在try塊之外檢查null

只需將myIni.get(“toto”)放在try catch塊中,或者寫入Ini myIni = null; 在第一行。 請注意,如果您執行第二個變體,如果找不到該文件,或者由於任何其他原因無法讀取,則可能會出現NullPointerException ...

干杯! P

Ini myIni = null; 就是這樣

在catch語句中,您不定義變量的值。 因此,如果你捕獲然后運行myIni.get("toto"); ,變量將沒有值myIni.get("toto"); 你想做這樣的事情:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");

即便如此,運行get()時也會獲得NPE。

在您的代碼中,如果發生異常,則無法實例化變量myIni,這就是編譯器發出此類警告的原因。

你可以把它改成:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}
if(myIni!=null){
myIni.get("toto");
}

正如@khachik指出的那樣,最好在try塊本身內聲明並初始化變量。 只有當你感到極度自信而且與傲慢無法區分時,才會在下面進行初始化。

Ini myIni = null;

暫無
暫無

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

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