2012-01-24 24 views
7
try { 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    fr.close(); 
} 

Các fr.close() thấy một lỗi:Đóng tập tin trong khối finally không hoạt động

fr cannot be resolved

Tôi đã đọc rằng đóng một tập tin trong khối cuối cùng là một thực hành tốt.
Điều gì đang làm sai?

Trả lời

17

Biến số fr chỉ có phạm vi trong khối try. Nó nằm ngoài phạm vi trong khối cuối cùng. Bạn cần phải khai báo nó trước các try khối:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} finally { 
    if (fr != null) { 
     try { 
      fr.close(); 
     } catch (IOException e) { 
      // This is unrecoverable. Just report it and move on 
      e.printStackTrace(); 
     } 
    } 
} 

này là khá một mô hình phổ biến của mã, vì vậy nó rất tốt để ghi nhớ nó cho các tình huống tương tự trong tương lai.

Cân nhắc ném IOException từ phương pháp này - dấu vết theo dõi in ấn không phải là rất hữu ích để người gọi, bạn sẽ không cần cố gắng nắm bắt lồng nhau xung quanh fr.close()

+0

Nếu tôi làm điều đó thì nó nói rằng tôi cần thêm một khối Thử khác trong khi đóng tệp. Tôi đã đọc một bài đăng trước đó, người ta nói rằng không có gì có thể làm được. Vì vậy, đây sẽ là cách tốt nhất là nó? – noMAD

+0

Vâng, điều đó thật khó chịu. Người ta thường viết một phương thức tiện ích, có tên "closeQuietly" (hoặc tương tự) để làm điều này. Nó bắt và bỏ qua Ngoại lệ. – user949300

+0

Xem câu trả lời đã chỉnh sửa cho 'try/catch' lồng nhau - cũng là mẫu chung – Bohemian

5

Bây giờ cuối cùng khối là không cần thiết,

try (FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr);){ 

    String line = null; 

    } 

} catch(FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} 

giờ tự động đóng độc giả của bạn

+2

Có, nhưng chỉ trong Java 7. Java 6 và trước đó không có điều này. – user949300

+0

vâng, điều đó đúng. – Kushan

+0

Trong trường hợp bất kỳ ai thắc mắc tại sao lại như vậy, hãy tìm kiếm "try with resources" – axxis

0

Bạn gặp sự cố với phạm vi của mình. Nếu bạn thực sự muốn sử dụng cú pháp đó, bạn nên sửa nó như sau:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    if(fr != null) 
     fr.close(); 
} 

theo cách đó, fr sẽ tồn tại trong phạm vi khối cuối cùng.

Các vấn đề liên quan