2014-06-18 60 views
0

首先,我知道我應該使用帶資源的try-catch,但是我目前沒有在我的系統上使用最新的JDK。Try-Catch-Finally - Final Block無法識別變量

我有下面的代碼,並試圖確保資源閱讀器關閉使用finally塊,但下面的代碼不能編譯的原因有兩個。首先,讀者可能還沒有被初始化,其次close()應該在自己的try-catch中被捕獲。這兩個原因都不是擊敗了初始try-catch塊的對象嗎?

我可以通過將它放在自己的try-catch中來解決finally塊close()語句的問題。然而這還留下關於讀者未被初始化的編譯錯誤?

我假設我出事了嗎?幫助讚賞!

乾杯,

public Path [] getPaths() 
    { 
     // Create and initialise ArrayList for paths to be stored in when read 
     // from file. 
     ArrayList<Path> pathList = new ArrayList(); 
     BufferedReader reader; 
     try 
     { 
      // Create new buffered read to read lines from file 
      reader = Files.newBufferedReader(importPathFile); 
      String line = null; 
      int i = 0; 
      // for each line from the file, add to the array list 
      while((line = reader.readLine()) != null) 
      { 
       pathList.add(0, Paths.get(line)); 
       i++; 
      } 
     } 
     catch(IOException e) 
     { 
      System.out.println("exception: " + e.getMessage()); 
     } 
     finally 
     { 
      reader.close(); 
     } 


     // Move contents from ArrayList into Path [] and return function. 
     Path pathArray [] = new Path[(pathList.size())]; 
     for(int i = 0; i < pathList.size(); i++) 
     { 
      pathArray[i] = Paths.get(pathList.get(i).toString()); 
     } 
     return pathArray; 
    } 

回答

2

沒有其他方式,然後初始化您的緩衝區並捕獲異常。編譯器總是正確的。

BufferedReader reader = null; 
try { 
    // do stuff 
} catch(IOException e) { 
    // handle 
} finally { 
    if(reader != null) { 
     try { 
      reader.close(); 
     } catch(IOException e1) { 
      // handle or forget about it 
     } 
    } 
} 

方法close永遠需要一個try-catch塊,因爲它宣稱,它可以拋出IOException。如果調用位於finally塊或其他位置,則無關緊要。它只是需要處理。這是一個檢查的例外。

閱讀也必須初始化爲null。恕我直言,這是超級無用的,但這是Java。這就是它的工作原理。

+0

Excatly,看起來像無意義的代碼生成:S感謝幫助解決初始化問題。 – Dave0504

0

相反檢查reader爲空或不是,然後相應地關閉它像下面(你應該叫close()reader只有當它不爲空,或者如果它已經早已其他實例,你將結束後來得到null reference例外)。

finally 
    { 
     if(reader != null) 
     { 
      reader.close(); 
     } 
    } 
+0

感謝您的輸入Rahul – Dave0504