为什么我在Java中收到未报告的异常错误

时间:2014-01-01 18:17:29

标签: java exception file-io compiler-errors try-catch

我正在尝试将文本文件加载到java中,以便将每个单词存储在单词的ArrayList中。 (这是我创建的一个没有问题的对象。

import java.util.*;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class txtUtils
{
public ArrayList<Word> readFromText(ArrayList<Word> Words)
{
    String file = "corpus.txt";
    FileInputStream in = new FileInputStream(file);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String strLine;

        while ((strLine = br.readLine()) != null) {
            for (int j = 0; j < strLine.length(); j++){
                {         
                    strLine = br.readLine();
                    int start = 0;
                    for(int x= start; x < strLine.length(); x++)
                    {
                        if(strLine.charAt(x)== ' ' || strLine.charAt(x) == '.')
                        {     
                            Words.add(new Word((strLine.substring(start,x- 1)).toUpperCase()));
                            start = x;
                        }
                    }
                }
            }

        }   
    in.close();
    return Words;

}
}

编译时,我收到此错误。

unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

显示为该行,     FileInputStream in = new FileInputStream(file);

文件显然在那里,甚至已经添加到我的类路径中,所以我不明白为什么它继续抛出这个异常。有没有办法覆盖它?如果没有,还有其他方法可以将文本文件加载到java中吗?

4 个答案:

答案 0 :(得分:1)

异常没有被抛出,它告诉你需要将代码放在try-catch块中或让你的函数抛出异常。

编辑:所以有一个-1投票,但没有解释什么是缺失或完全不正确,以证明它的合理性。

答案 1 :(得分:1)

public ArrayList<Word> readFromText(ArrayList<Word> Words) throws FileNotFoundException

被称为'声明'例外。该方法声明可能抛出此异常。

在这种情况下宣布它比在try / catch更好。这是因为您的班级处于较低级别,而较高级别的班级(例如使用此班级的班级)更适合try / catch

更一般地说,请参阅:

答案 2 :(得分:0)

您的问题不会在运行时发生,而是在编译时发生。编译器警告你,因为它不知道如果没有文件该怎么做。

在java中,可以捕获或抛出异常。要捕获异常,请在代码周围使用这样的语句:

try
{
    FileInputStream in = new FileInputStream(file);
}
catch(FileNotFoundException e)
{
    e.printStackTrace();
}

即使抛出异常,这也将允许您的代码继续工作,e.printStackTrace()行将打印出有关异常的信息。

Alternativley,您可以通过向方法标题添加throws声明来抛出异常,如下所示:public ArrayList<Word> readFromText(ArrayList<Word> Words) throws FileNotFoundException

然后抛出异常。这意味着在编译时将忽略该异常,并将其推送到下一层。问题是当有人最终使用你的txtutils类时,他们还必须捕获或抛出异常。

答案 3 :(得分:0)

这里出现编译错误。这是因为您正在调用某些可能在运行时抛出异常的函数,但您没有采取任何预防措施来处理它。 Java不会对所有类型的异常执行此操作。

这是对java中所谓的已检查和未经检查的异常的一个很好的解释。

Checked vs Unchecked Exceptions in Java

在您的情况下,您可以通过两种方式克服此问题。

一种方法是将语句括在try-catch块周围。

public ArrayList<Word> readFromText(ArrayList<Word> Words)
{
    try{
        String file = "corpus.txt";
        FileInputStream in = new FileInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        // other program logic...

        in.close();
        return Words;
    }catch(Exception e){
        // do something if error occurs...
        return null;  // or an empty ArrayList...
    }
}

有关处理异常的更多信息,请参阅此内容。

Catching and Handling Exceptions

另一种方法是将方法声明为抛出异常的方法。

public ArrayList<Word> readFromText(ArrayList<Word> Words) throws Exception
{
   // method logic goes here
}

但是,如果你这样做,那么无论调用这个方法的方法也应该像这样声明,或者他们应该在try-catch块中处理异常。