2013-03-07 35 views
5
public static int howMany(String FileName) 
{ 
    BufferedReader br = null; 

    try 
    { 
     FileInputStream fis = new FileInputStream(FileName); 
     DataInputStream dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.print("FILE DOESN'T EXIST"); 
    } 
    finally 
    { 
     fis.close(); 
     dis.close(); 
     br.close(); 
    } 


    String input; 
    int count = 0; 

    try 
    { 

     while ((input = br.readLine()) != null) 
     { 
      count++; 
     } 

    } 
    catch (IOException e) 
    { 
     System.out.print("I/O STREAM EXCEPTION"); 
    } 


    return count; 
} 

Vì lý do nào đó, tôi không thể đóng bất kỳ đối tượng I/O nào. fis.close(), dis.close(), br.close() tất cả cho tôi không thể tìm thấy biểu tượng mặc dù tôi đã nhập tất cả thư viện I/O (nhập java.io. *;) và khởi tạo tất cả các đối tượng."không thể tìm thấy biểu tượng" khi cố gắng đóng đối tượng I/O

+0

hurr tôi gặp phải lỗi: ngoại lệ không được báo cáo IOException; phải bị bắt hoặc tuyên bố ném 3 lần bây giờ –

Trả lời

5
BufferedReader br = null; 
FileInputStream fis =null; 
DataInputStream dis null; 
try { 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 

Đặt chúng ra khỏi số try block để khối cuối cùng của bạn có thể thấy các biến.

+0

hurr tôi nhận được lỗi: ngoại lệ chưa được báo cáo IOException; phải bị bắt hoặc tuyên bố ném 3 lần bây giờ –

+0

@MatthewLoch đặt một khối catch khác và bắt IOException. nhưng chắc chắn rằng bắt hirarchey của bạn là bắt (FileNotFound) {} ​​bắt (IOException) – PermGenError

+0

cố định nó nevermind –

1

Bạn phải khai báo tất cả các con suối bên ngoài khối try, nếu không họ sẽ không được hiển thị trong finally khối:

FileInputStream fis = null; 
DataInputStream dis = null; 
BufferedReader br = null; 

Ngoài ra, bạn có thể sử dụng try-with-resources cú pháp mới Java 7 để tự động hóa tài nguyên đóng cửa.

1

đối tượng của bạn đang bị rỗng bên trong khối bạn

FileInputStream fis =null; 
DataInputStream dis null; 

định nghĩa chúng bên ngoài một cái gì đó như thế này khối

try{ 

    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 

    } 
0

Bạn đã scoped fis vào bên trong khối try nên cuối cùng không biết nó ở đó. Hãy thử:

FileInputStream fis; 
DataInputStream dis; 
try 
    { 
     fis = new FileInputStream(FileName); 
     dis = new DataInputStream(fis); 
     br = new BufferedReader(new InputStreamReader(dis)); 
    } 
0

Hãy thử điều này:

BufferedReader br = null; 
FileInputStream fis = null; 
DataInputStream dis = null; 
try 
{ 
    fis = new FileInputStream(FileName); 
    dis = new DataInputStream(fis); 
    br = new BufferedReader(new InputStreamReader(dis)); 
} 
0

Trình biên dịch được phàn nàn rằng các biến bạn đang tham khảo trong khối cuối cùng đang không ở trong phạm vi tại thời điểm đó, mà câu trả lời hiện có bao gồm đầy đủ. Tuy nhiên, có rất nhiều vấn đề khác ở đây.

Một vấn đề lớn ở đây là bạn đang cố gắng tham khảo BufferedReader sau khi nó đã bị đóng. Di chuyển logic đếm vào khối thử đầu tiên và loại bỏ khối thứ hai.

Khi bạn kết hợp người đọc và luồng như trong ví dụ của bạn, chỉ cần kết thúc một trình duyệt ngoài cùng và luồng ngoài cùng. BufferedReader lưu một tham chiếu đến người đọc được truyền vào nó và sẽ đảm bảo rằng nó được đóng khi nó được. Tương tự như vậy, InputStreamReader sẽ đóng luồng đầu vào được truyền vào nó, điều này sẽ đóng fileInputStream được truyền vào nó.

Các fis và dis biến thậm chí không cần thiết, bạn có thể làm tổ các cuộc gọi constructor:

br = new BufferedReader(new InputStreamReader(
     new DataInputStream(new FileInputStream(FileName)))); 

Đưa nhiều hơn một chặt chẽ trong một khối finally là xấu; nếu một ngoại lệ xảy ra khi đóng một trong số các tài nguyên này, các tài nguyên còn lại sẽ không bị đóng.

Cũng ngoại lệ được ném vào khối cuối cùng sẽ che dấu bất kỳ ngoại lệ nào được ném vào khối thử. Ngoại lệ ban đầu (với thông tin về những gì đã xảy ra) bị loại bỏ và ngoại lệ được ném vào gần (không phải là thông tin) là một ngoại lệ được truyền đi.

Sẽ là một cải tiến để kiểm tra các tài nguyên thử, được thiết kế để đối phó với việc đóng nhiều tài nguyên và loại bỏ khả năng loại trừ ngoại lệ.

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