Tôi đang viết một ứng dụng kết nối với một trang web và đọc một dòng từ đó. Tôi làm như sau:Đóng tài nguyên Java
try{
URLConnection connection = new URL("www.example.com").openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String response = rd.readLine();
rd.close();
}catch (Exception e) {
//exception handling
}
Có tốt không? Ý tôi là, tôi đóng BufferedReader ở dòng cuối cùng, nhưng tôi không đóng InputStreamReader. Tôi có nên tạo một InputStreamReader độc lập từ connection.getInputStream và một BufferedReader từ InputStreamReader độc lập, hơn là đóng tất cả hai trình đọc không? Tôi nghĩ rằng nó sẽ được tốt hơn để đặt các phương pháp đóng cửa trong khối finally như thế này:
InputStreamReader isr = null;
BufferedReader br = null;
try{
URLConnection connection = new URL("www.example.com").openConnection();
isr = new InputStreamReader(connection.getInputStream());
br = new BufferedReader(isr);
String response = br.readLine();
}catch (Exception e) {
//exception handling
}finally{
br.close();
isr.close();
}
Nhưng nó là xấu xí, bởi vì các phương pháp đóng cửa có thể ném ngoại lệ, vì vậy tôi phải xử lý hoặc vứt nó.
Giải pháp nào tốt hơn? Hoặc giải pháp tốt nhất là gì?
Mã của bạn đã thực sự có một chút vấn đề trong mệnh đề cuối cùng. Có thể cho 'isr' và' br' vẫn là 'null' trong mệnh đề cuối cùng là các hàm tạo' InputStreamReader' và 'BufferedReader' có thể ném các ngoại lệ. Bạn nên thay đổi mệnh đề cuối cùng thành: 'finally {if (br! = Null) br.close(); if (isr! = null) isr.close(); } '. Điều này vẫn không đúng bởi vì 'br.close() 'có thể ném một ngoại lệ và do đó' isr' sẽ không bị đóng trong trường hợp đó. Câu trả lời của Andreas dường như là cách để theo dõi IMHO. – Behrang
Không bao giờ bắt được 'Ngoại lệ 'trừ khi bạn biết tại sao –