1

可能重复:
为什么我得到“未处理的异常类型 IOException”?

我正在尝试使用以下算法求解 Euler #8。问题是,每当我修改我有巨大注释的行时,错误Unhandled Exception Type IOException出现在我用注释标记的每一行上//###

private static void euler8()
{   
    int c =0;
    int b;
    ArrayList<Integer> bar = new ArrayList<Integer>(0);
    File infile = new File("euler8.txt");
    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(
                            new FileInputStream(infile), //###
                            Charset.forName("UTF-8")));
        while((c = reader.read()) != -1) { //###
          char character = (char) c;
          b = (int)character;
          bar.add(b); /*When I add this line*/
        }
    reader.close(); //###
}
4

4 回答 4

6

是的,IOException是一个检查异常,这意味着你要么需要捕获它,要么声明你的方法也会抛出它。如果抛出异常,你想发生什么?

请注意,无论如何,您通常都应该关闭readerinfinally块,以便即使在遇到另一个异常时它也会关闭。

有关已检查和未检查异常的更多详细信息,请参阅有关异常的 Java 教程课程。

于 2012-12-19T17:37:05.400 回答
2

一种解决方案:更改为

private static void euler8() throws IOException {

但是调用方法必须捕获 IOException。

或捕捉异常:

private static void euler8()
{   
    int c =0;
    int b;
    ArrayList<Integer> bar = new ArrayList<Integer>(0);
    BufferedReader reader;
    try { 
        File inFile = new File("euler8.txt");
        reader = new BufferedReader(
                            new InputStreamReader(
                            new FileInputStream(infile), //###
                            Charset.forName("UTF-8")));
        while((c = reader.read()) != -1) { //###
          char character = (char) c;
          b = (int)character;
          bar.add(b); /*When I add this line*/
        }
    } catch (IOException ex) {
       // LOG or output exception
       System.out.println(ex);
    } finally {
        try {
           reader.close(); //###
        } catch (IOException ignored) {}
    }
}
于 2012-12-19T17:39:00.967 回答
0

包装在 try/catch 块中以捕获异常。

如果您不这样做,它将无法处理。

于 2012-12-19T17:37:38.687 回答
0

如果您无法读取指定的文件会怎样?这FileInputStream将引发异常,Java 要求您必须检查并处理它。

这种类型的异常称为检查异常。存在未经检查的异常,Java 不需要您处理这些异常(主要是因为它们无法处理 - 例如OutOfMemoryException

请注意,您的处理可能包括抓住它并忽略它。这不是一个好主意,但 Java 无法真正确定 :-)

于 2012-12-19T17:37:47.597 回答