【问题标题】:Why am I getting an unreported exception error in Java为什么我在 Java 中收到未报告的异常错误
【发布时间】:2014-01-01 18:17:28
【问题描述】:

我正在尝试将文本文件加载到 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 中吗?

【问题讨论】:

  • 您对异常有什么不明白的地方?仔细阅读,然后用谷歌搜索。
  • 这是异常(带有堆栈跟踪)还是编译器错误消息?
  • “所以我不明白为什么它一直抛出这个异常” 不是抛出那个异常,而是 编译器 告诉你它可能会在运行时抛出。

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


【解决方案1】:

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

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

【讨论】:

  • 似乎 OP 在理解异常在 java 中的工作方式方面遇到了一些麻烦,因此某种更具体的帮助或有用的链接会很好。
  • 但这并不能证明投反对票是合理的,因为我提供的信息是准确的。在 no 投票的情况下的适当行动。这几乎不是误导性信息吗?
【解决方案2】:
public ArrayList<Word> readFromText(ArrayList<Word> Words) throws FileNotFoundException

被称为“声明”异常。该方法声明可能会抛出此异常。

在这种情况下,最好声明它,而不是 try/catch。这是因为您的班级处于较低级别和较高级别的班级,例如将使用该班级的班级,将更适合try/catch

更一般地,请参阅:

【讨论】:

  • 猜测一下,我建议这里有一个人回答并否决了其他所有人。
【解决方案3】:

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

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

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

这将允许您的代码在抛出异常的情况下继续工作,并且e.printStackTrace() 行将打印出有关异常的信息。

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

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

【讨论】:

    【解决方案4】:

    在这里你得到一个编译错误。这是因为您正在调用一些可能在运行时引发异常的函数,但您没有采取任何预防措施来处理它。 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 块中处理异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多