2013-06-01 73 views
0

我在編寫我的應用程序時遇到了相當麻煩。這是我的問題:正在初始化Try/Catch

我試圖初始化像這樣的文件輸入流:

FileInputStream fis 
fis = openFileInput(selectedFile); 

再後來就把這1行:

byte[] input = new byte[fis.available()]; 

問題是代碼的兩個位需要嘗試/ catch語句,第二個塊無法識別fis,因爲它是在try/catch中初始化的。這裏是我的代碼:

private void openFile(String selectedFile) { 
     String value = ""; 
     FileInputStream fis; 
     try { 
      fis = openFileInput(selectedFile); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


     try { 
      byte[] input = new byte[fis.available()]; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

我該怎麼辦? (在此先感謝)

+0

初始化FIS到臨時值(如果你嘗試'null'它會工作)。事情是,這就是程序應該如何工作。 –

+2

在try/catch之外聲明變量,或者捕獲這兩個異常。 –

+0

您嘗試打開該文件,如果失敗,則只打印堆棧跟蹤並嘗試繼續......這將產生一個NPE。讓你的'openFile()'方法至少拋出'IOException'! – fge

回答

0

設置FileInputStream fis = null;當您第一次聲明該變量。

你也可以像這樣運行你的代碼,因爲IOException也會捕獲找不到的文件異常。

String value = ""; 
FileInputStream fis; 
try { 
    fis = openFileInput(selectedFile); 
    byte[] input = new byte[fis.available()]; 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

您也可能希望在第一個異常之後返回,或者在第二個塊中添加空檢查。 – kcoppock

+0

非常感謝!我會將您的答案標記爲正確,但我需要12分鐘以上 –

+0

我做了一個小小的編輯,爲您提供了修復代碼的另一種方法。 –

0

將FileInputStream設置爲臨時值。 null將是最好的選擇,如:

FileInputStream fis = null; 

這樣做的原因是因爲如果你的try語句拋出一個錯誤,那麼FIS將永遠不會我初始化。那麼你會遇到問題。如果你沒有完全退出這個東西,你還應該在try/catch塊之後添加語句來測試這個值是否爲空,以便程序不會拋出空指針異常。

因此,也許是這樣的:

if(fis == null) { 
    return; // Which will just end the method. 
} 

可能還希望把嘗試/捕捉到一起(你還是應該申報其他的東西的嘗試之​​外,至少任何你打算以後直接使用代碼),但它也許會是更有效的編碼方式),如:

FileInputStream fis = null; 
byte[] input = null; 
try { 
    fis = openFileInput(selectedFile); 
    input = new byte[fis.available()]; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
1

在這種情況下,最好的辦法是不要趕IOException異常都沒有。

private void openFile(String selectedFile) throws IOException { 
     FileInputStream fis = openFileInput(selectedFile); 
     byte[] input = new byte[fis.available()]; 

它沒有任何意義,繼續你有FileNotFoundException異常後

+0

不要忘記,你需要關閉finally塊上的輸入流,所以即使這樣也應該被'try/finally'包圍。 –