2010-03-07 35 views
6

Tôi đang cố gắng sử dụng một chút mã tôi tìm thấy ở dưới cùng của this page. Đây là mã trong một lớp học mà tôi đã tạo cho nó:Java Hãy thử và bắt IOException Vấn đề

import java.io.LineNumberReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class LineCounter { 
    public static int countLines(String filename) throws IOException { 
    LineNumberReader reader = new LineNumberReader(new FileReader(filename)); 
    int cnt = 0; 
    String lineRead = ""; 
    while ((lineRead = reader.readLine()) != null) {} 
    cnt = reader.getLineNumber(); 
    reader.close(); 
    return cnt; 
    } 
} 

Mục tiêu của tôi là để đếm số dòng của một tập tin văn bản, lưu trữ số đó là một số nguyên, sau đó sử dụng số nguyên trong lớp học chính của tôi. Trong lớp học chính của tôi, tôi đã thử một vài cách khác nhau để làm điều này xảy ra, nhưng (là một lập trình viên mới) tôi đang thiếu một cái gì đó. Đây là điều đầu tiên tôi đã thử:

String sFileName = "MyTextFile.txt"; 
private int lineCount = LineCounter.countLines(sFileName); 

Với nỗ lực này, tôi nhận được lỗi "không được báo cáo ngoại lệ java.io.IOException; phải được khai báo hoặc khai báo." Tôi không hiểu tại sao tôi nhận được điều này bởi vì như tôi có thể thấy ngoại lệ được khai báo trong phương thức "countLines" của tôi. Tôi đã cố gắng sử dụng một khối try try ngay dưới bit cuối cùng của mã tôi đăng, nhưng điều đó đã không làm việc hoặc là (tôi không nghĩ rằng tôi đã làm nó mặc dù). Đây là nỗ lực bắt thử của tôi:

String sFileName = "MyTextFile.txt"; 
private int lineCount;{ 
    try{ 
     LineCounter.countLines(sFileName); 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 
} 

Hãy chỉ đường cho tôi! Cảm ơn trước sự giúp đỡ của bạn!

Trả lời

3

Initializer khối là giống như bất kỳ bit mã; nó không được "gắn" vào bất kỳ trường/phương thức nào trước nó. Để gán các giá trị cho các trường, bạn phải sử dụng một cách rõ ràng trường như các lh của một câu lệnh gán.

private int lineCount; { 
    try{ 
     lineCount = LineCounter.countLines(sFileName); 
     /*^^^^^^^*/ 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 
} 

Ngoài ra, countLines của bạn có thể được thực hiện đơn giản hơn:

public static int countLines(String filename) throws IOException { 
    LineNumberReader reader = new LineNumberReader(new FileReader(filename)); 
    while (reader.readLine() != null) {} 
    reader.close(); 
    return reader.getLineNumber(); 
    } 

Dựa trên thử nghiệm của tôi, có vẻ như bạn có thể getLineNumber() sau close().

+1

Câu trả lời là đúng về mặt kỹ thuật (OP chỉ đơn giản là quên gán giá trị cho tham chiếu), nhưng đó không phải là khối khởi tạo ** static **. Nó chỉ là một khối khởi tạo :) – BalusC

+0

Mã bit đầu tiên của bạn hoạt động hoàn hảo! Tôi đã rất gần :) bit thứ hai của bạn của mã hoạt động quá, nhưng NetBeans nói với tôi trong khi vòng lặp trống. Chương trình vẫn biên dịch và chạy ok, vì vậy tôi đoán đó là chấp nhận được? – ubiquibacon

+0

Nó chỉ đơn giản là bỏ qua nội dung.Bạn thực sự chỉ quan tâm đến số lượng các dòng. Bạn cũng có thể sử dụng 'BufferedReader' kết hợp với' int count' mà bạn tăng trong vòng lặp. – BalusC

1

Phương thức countLines(String filename) ném IOException.

Bạn không thể sử dụng nó trong khai báo thành viên. Bạn cần thực hiện thao tác theo phương thức main(String[] args).

Phương thức main(String[] args) của bạn sẽ nhận được IOException được ném vào nó bằng countLines và nó sẽ cần xử lý hoặc khai báo.

Hãy thử điều này chỉ cần ném IOException từ chính

public class MyClass { 
    private int lineCount; 
    public static void main(String[] args) throws IOException { 
    lineCount = LineCounter.countLines(sFileName); 
    } 
} 

hay này để xử lý nó và bọc nó trong một IllegalArgumentException kiểm soát:

public class MyClass { 
    private int lineCount; 
    private String sFileName = "myfile"; 
    public static void main(String[] args) throws IOException { 
    try { 
     lineCount = LineCounter.countLines(sFileName); 
    } catch (IOException e) { 
     throw new IllegalArgumentException("Unable to load " + sFileName, e); 
    } 
    } 
} 
+0

Xin lỗi, đã đọc câu hỏi lúc đầu! – Brabster

+0

Cảm ơn bạn đã trả lời, tất cả các bạn đều tuyệt vời! – ubiquibacon

1

Lý do bạn nhận được IOException là vì bạn không bắt IOException của phương thức countLines của bạn. Bạn sẽ muốn thực hiện một việc như sau:

public static void main(String[] args) { 
    int lines = 0; 

    // TODO - Need to get the filename to populate sFileName. Could 
    // come from the command line arguments. 

    try { 
     lines = LineCounter.countLines(sFileName); 
    } 
    catch(IOException ex){ 
     System.out.println (ex.toString()); 
     System.out.println("Could not find file " + sFileName); 
    } 

    if(lines > 0) { 
    // Do rest of program. 
    } 
} 
+0

Cảm ơn bạn đã trả lời! – ubiquibacon

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