2013-11-22 40 views
4

使用try與資源我有這樣的方法,其中我使用了Java的資源嘗試SE 7錯誤而在Java

private void generateSecretWord(String filename){ 

     try (FileReader files = new FileReader(filename)){ 
      Scanner input = new Scanner(files); 
      String line = input.nextLine(); 
      String[] words = line.split(","); 
      Collections.shuffle(Arrays.asList(words)); 
      if (words[0].length()>1){ 
       secretWord = words[0]; 
       return; 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      if (files!=null) files.close(); 
     } 

    } 

我得到的編譯錯誤finallyfiles cannot be resolved to a variable 我在文件中引用try with block。爲什麼我得到這個錯誤以及如何解決它?

感謝

回答

5

Java Language Spec(14.20.3)摘自:

一次嘗試與資源語句與try塊的執行之前被初始化和自動關閉變量(稱爲資源)參數化,在執行try塊之後,按照它們初始化的相反順序。當資源自動關閉時,catch子句和finally子句通常不必要

ResourceSpecification聲明一個或多個帶初始化表達式的本地變量,作爲try語句的資源

所以你不需要關閉資源了。試用資源會自動爲您執行,您的FileReader僅在try塊中可用。因此你會得到那個編譯錯誤。

+0

意思是不需要的或''一個塊finally'直接關閉files'是不需要 – eagertoLearn

+0

@ user2708477這意味着不需要'finally'塊來關閉資源。如果您需要做其他事情,即使發生「異常」也不能跳過,那麼您仍然需要一個「finally」塊。但是,如果您只是想確保文件在任何情況下都會被關閉,您不需要一個文件,因爲這會隱式完成。 – noone

10

當您使用與您並不需要顯式地關閉這些資源的嘗試。試用資源將負責關閉這些資源。

基於try-wtih-resource document

試戴與資源語句是聲明瞭一個或多個資源的try語句。資源是程序結束後必須關閉的對象。 try-with-resources語句確保每個資源在語句結束時都關閉。

2

因爲沒有其他人已經提到這一點,如果你想手動處理它,你可以這樣做:

private void generateSecretWord(String filename){ 
     FileReader files = null; 
     try { 
      files = new FileReader(filename); 
      Scanner input = new Scanner(files); 
      String line = input.nextLine(); 
      String[] words = line.split(","); 
      Collections.shuffle(Arrays.asList(words)); 
      if (words[0].length()>1){ 
       secretWord = words[0]; 
       return; 
      } 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     finally { 
      if (files!=null) 
       files.close(); 
     } 

    }