[英]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個選擇:
myIni.get("toto");
在try
塊內。 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.