Java尝试和捕获IOException问题

Java Try and Catch IOException Problem

我试图使用我在本页底部找到的一些代码。 这是我为它创建的类中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
  }
}

我的目标是计算文本文件的行,将该数字存储为整数,然后在我的主类中使用该整数。 在我的主要课程中,我尝试了几种不同的方法来实现这一点,但是(作为一名新程序员)我错过了一些东西。 这是我尝试的第一件事:

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

通过此尝试,我得到错误"未报告的异常java.io.IOException;必须被捕获或声明被抛出"。 我不明白为什么我得到这个,因为我可以看到异常是在我的"countLines"方法中声明的。 我尝试在我发布的最后一段代码下使用try catch块,但这也没有用(我不认为我做得对)。 这是我试试的尝试:

1
2
3
4
5
6
7
8
9
10
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);
    }
}

请告诉我方式! 在此先感谢您的帮助!


初始化块就像任何代码位一样; 它不会"附加"到它之前的任何字段/方法。 要为字段赋值,必须显式使用该字段作为赋值语句的lhs。

1
2
3
4
5
6
7
8
9
10
private int lineCount; {
    try{
        lineCount = LineCounter.countLines(sFileName);
        /*^^^^^^^*/
    }
    catch(IOException ex){
        System.out.println (ex.toString());
        System.out.println("Could not find file" + sFileName);
    }
}

此外,您的countLines可以更简单:

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

根据我的测试,看起来你可以在close()之后getLineNumber()


获得IOException的原因是因为您没有捕获countLines方法的IOException。 你会想做这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.
   }
}


您的countLines(String filename)方法抛出IOException。

您不能在成员声明中使用它。 您需要以main(String[] args)方法执行操作。

您的main(String[] args)方法将获得countLines抛出的IOException,它将需要处理或声明它。

试试这个只是从main抛出IOException

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

或者这个来处理它并将其包装在未经检查的IllegalArgumentException中:

1
2
3
4
5
6
7
8
9
10
11
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);
     }
  }
}