2015-05-01 166 views
0

我在try-exception之前宣佈Scanner infil e,但由於某種原因它說變數可能未被初始化?變量可能未從Scanner初始化?

Scanner infile; 
     try 
     { 
      infile = new Scanner(file); 
     } 
     catch(FileNotFoundException f) 
     { 
      System.out.println("Wrong File Path"); 
     } 

     while (infile.hasNext()) 
     { 
      System.out.print("Testing While loop"); 

回答

2

請考慮如果在構造函數調用new Scanner中引發異常會發生什麼情況。構造函數從未完成,因此new Scanner(file)不會生成值;那麼對於infile

要糾正它,移動你的while循環try塊:

Scanner infile; 
try 
{ 
    infile = new Scanner(file); 

    while (infile.hasNext()) 
    { 
     System.out.print("Testing While loop"); 
    } 
} 
catch(FileNotFoundException f) 
{ 
    System.out.println("Wrong File Path"); 
} 

的異常處理的目的,畢竟是把它弄出來的你的主要邏輯的方式。

+0

但我會在最後使用構造函數。移動'while'循環並在'try'內部聲明構造函數會導致很多錯誤和更復雜的編程。對 ? @ T.J.Crowder – DkgMarine

+0

剛剛編輯了我的最新評論。請給我你的意見? – DkgMarine

+0

@DkgMarine:不會。通過在所有*你的邏輯上放置一個'try'並在最後處理異常,你可以讓事情變得更加複雜,而不是更多。但是你有一個選擇:如果你不想把你的邏輯放在'try'裏面(這是最好的做法),你可以在'catch'塊中設置'infile = null',然後把循環改爲' while(infile!= null && infile.hasNext())'。但是,不是最佳實踐。您可能會發現[Java例外](https://docs.oracle.com/javase/tutorial/essential/exceptions/)有用。 –

0

想象一下infile = new Scanner(file);引發異常的情況。在while (infile.hasNext())的位置,infile不會被初始化。

只需將Scanner infile;更改爲Scanner infile = null;即可解決此問題。但請注意,如果拋出異常,infile仍然可以爲空。您應該將這部分代碼放在try區塊內。