2013-03-07 39 views
5
public static int howMany(String FileName) 
{ 
    BufferedReader br = null; 

    try 
    { 
     FileInputStream fis = new FileInputStream(FileName); 
     DataInputStream dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.print("FILE DOESN'T EXIST"); 
    } 
    finally 
    { 
     fis.close(); 
     dis.close(); 
     br.close(); 
    } 


    String input; 
    int count = 0; 

    try 
    { 

     while ((input = br.readLine()) != null) 
     { 
      count++; 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.print("I/O STREAM EXCEPTION"); 
    } 


    return count; 
} 

由於某種原因,我無法關閉任何I/O對象。即使我導入了所有的I/O庫(import java.io. *;)並啓動了所有對象,fis.close(),dis.close(),br.close()也都找不到符號。嘗試關閉I/O對象時出現「找不到符號」

+0

hurr我得到錯誤:未報告的異常IOException;必須被捕獲或聲明現在拋出3次 – 2013-03-07 21:27:52

回答

5
BufferedReader br = null; 
FileInputStream fis =null; 
DataInputStream dis null; 
try { 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 

把它們放在你的try block之外,這樣你的finally塊可以看到變量。

+0

hurr我得到錯誤:未報告的異常IOException;必須被捕獲或聲明現在拋出3次 – 2013-03-07 21:26:58

+0

@MatthewLoch放置另一個catch塊並捕獲IOException。但確保你的catch hirarchey是catch(FileNotFound){} catch(IOException) – PermGenError 2013-03-07 21:30:09

+0

修復它從不知道 – 2013-03-07 21:56:12

1

您必須聲明try塊外所有流,否則他們將不會在finally塊可見:

FileInputStream fis = null; 
DataInputStream dis = null; 
BufferedReader br = null; 

或者,你可以使用Java 7的新try-with-resources語法自動化資源收盤。

1

你的對象是你的塊中被空

FileInputStream fis =null; 
DataInputStream dis null; 

定義它們的塊這樣的事情

try{ 

    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 

    } 
0

你作用域fis到try塊內,因此最後不知道外面在那。嘗試:

FileInputStream fis; 
DataInputStream dis; 
try 
    { 
     fis = new FileInputStream(FileName); 
     dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
0

試試這個:

BufferedReader br = null; 
FileInputStream fis = null; 
DataInputStream dis = null; 
try 
{ 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 
0

編譯器抱怨你在finally塊引用變量不在範圍在這一點上,這對現有的回答充分覆蓋。但是,這裏還有很多其他問題。

這裏的一個大問題是,你試圖在關閉BufferedReader後引用它。將計數邏輯移入第一個嘗試塊並擺脫第二個。

當您結合閱讀器和流如您的示例中,只有最外面的一個需要關閉。 BufferedReader保存對傳入其中的讀者的引用,並確保它在關閉時被關閉。同樣,InputStreamReader將關閉傳遞給它的輸入流,這將關閉傳遞給它的fileInputStream。

的FIS和DIS變量,甚至沒有必要,你可以嵌套調用構造函數:

br = new BufferedReader(new InputStreamReader(
     new DataInputStream(new FileInputStream(FileName)))); 

把一個以上的接近finally塊是壞的;如果發生異常時關閉其中一個,則剩餘資源不會關閉。

此外,在finally塊中拋出的異常將掩蓋try塊中拋出的任何異常。原始異常(包含有關出錯的信息)將被丟棄,並且關閉時引發的異常(不提供信息)將被傳播。

這將是一種改進,可以檢查試用資源,該資源旨在處理關閉多個資源並消除異常屏蔽的可能性。

相關問題