2015-05-01 43 views
2
FileExaminer(String filename) { 
     System.out.println(filename); 
     java.io.File file = new java.io.File(filename); 
     System.out.println(file); 
     Scanner input = null; 

    try { 
     input = new Scanner(file); 
    } catch (FileNotFoundException e) { 
     System.out.println("fiel not found" + file);   
    } 

    System.out.println(input); 
    System.out.println(input.hasNext()); 

    while(input.hasNextLine()) { 
     lines.add(input.nextLine()); 
    } 

    calcluateCharCountAlpha();  
} 

我有一個奇怪的問題。這是拋出一個空指針異常(也沒有發現文件異常)。我認爲由於某種原因,由於input = null行,輸入到相同文件的行設置不起作用。但是,如果我刪除= NULL部分 例如:的爲什麼這個try/catch方法不起作用?

Scanner input; 

代替

Scanner input = null; 

它說,我需要 「初始化」 的變量。 如果我刪除該行完全和更改

try { 
      input = new Scanner(file); 
     } catch 

try { 
      Scanner input = new Scanner(file); 
     } catch 

然後輸入無法解析

,如果我刪除上面的,並嘗試只是做

Scanner input = new Scanner(file); 

其中

Scanner input = null; 

是。 (不在try/catch塊),它說它需要一個try/catch塊。

據我所知。我不能在try/catch中聲明輸入或者在try/catch之外不可訪問。

如果我外面聲明它並給它的try/catch內的值沒有的try/catch那麼它不會被初始化

如果我外面聲明它和外面爲它分配一個值和外分配一個值在外部給它一個值將取代try/catch中給出的值

如果我只聲明它並在try/catch之外分配它的值,它說它必須在try/catch中。

所以這應該是怎樣。如果你得到一個FileNotFoundException,你不能只是抓住它,打印錯誤消息,並繼續工作嗎?(這開始變得很無奈)

回答

1

該塊具有通過它兩條路徑:

try { 
    input = new Scanner(file); 
} catch (FileNotFoundException e) { 
    System.out.println("file not found" + file); 
} 

一是路徑時,有也不例外,另一個是有FileNotFoundException時。

第一條路徑很好:input在此路徑末尾得到有效的Scanner。然而,第二條路徑保持input不變,即設置爲null

要解決此問題,請刪除try/catch,並讓異常傳播出構造函數。異常處理的一個非常重要的規則是你的代碼不應該捕獲它不準備處理的異常。在這種情況下,您的代碼無法對丟失的文件進行任何操作,因爲fileName來自外部。因此,拋出異常是做正確的事:

FileExaminer(String filename) throws FileNotFoundException { 
    ... 
    Scanner input = new Scanner(file); 
    ... 
} 
+0

現在我有try/catch語句的工作,但它仍然有一個文件未發現異常,即使文件是存在的......其導入到相同的封裝類,所以它應該是工作......我可以告訴變量正在獲取正確的值(與一些策略性地放置的打印語句),那是什麼文件被稱爲(即使區分大小寫)它只是沒有找到他們,即使它有正確的名稱。 – namenotfound

+0

@namenotfound「將其導入與類相同的包中,因此它應該工作」不,它不應該。在包中導入文件與在運行時訪問文件完全無關。避免文件未找到異常的唯一方法是確保文件實際存在於您正在讀取文件的絕對路徑中。 – dasblinkenlight

+0

那麼如何告訴它在哪裏找到它而不是給它「whatever.txt」? – namenotfound

1

若無其事。如果拋出異常,這意味着你的input變量沒有被初始化,並且你不能使用它。

這將更有意義,把使用input try塊內的所有代碼:

try { 
    input = new Scanner(file); 
    System.out.println(input); 
    System.out.println(input.hasNext()); 
    while(input.hasNextLine()) { 
     lines.add(input.nextLine()); 
    } 
} catch (FileNotFoundException e) { 
    System.out.println("file not found" + file); 
} 
0

環繞你的方法與嘗試捕捉捕獲錯誤,並使用Exception在catch塊捕獲所有異常的所有文件操作的一部分。

試試這個:

FileExaminer(String filename) { 

    try { 
     System.out.println(filename); 
     java.io.File file = new java.io.File(filename); 
     System.out.println(file); 
     Scanner input = null; 


     input = new Scanner(file); 



    System.out.println(input); 
    System.out.println(input.hasNext()); 

    while(input.hasNextLine()) { 
    lines.add(input.nextLine()); 
    } 

    } catch (Exception ex) { 
     System.out.println("Error: "+ ex); 

    } 
    calcluateCharCountAlpha();  

}