【问题标题】:Error "unreported exception java.io.ioexception must be caught or declared to be thrown" in Java classJava 类中的错误“必须捕获或声明抛出未报告的异常 java.io.ioexception”
【发布时间】:2014-10-24 00:05:38
【问题描述】:

由于某种原因,我收到“必须捕获或声明抛出未报告的异常 java.io.ioexception”。我在这个方法中抛出了一个 I/O 异常:

    private void setChar() throws IOException
    {
        try
        {
            int data = in.read(); 
            if(data==-1)
            {
                eof = true; 
            }
            else
            {
                currentChar = (char) data; 
            }
        }
        catch (IOException e) 
        {
            System.exit(0);
        }
    }

我在这里调用方法(在构造函数中):

private BufferedReader in;
private char currentChar;
private boolean done;

public Scanner(InputStream inStream)
{
    in = new BufferedReader(new InputStreamReader(inStream));
    done = false;
    getNextChar();
}

public Scanner(String inString)
{
    in = new BufferedReader(new StringReader(inString));
    done = false; 
    setChar();
}

我是否调用/抛出了错误的异常?

【问题讨论】:

  • 将头稍微向右转,然后阅读相关部分。

标签: java exception exception-handling io ioexception


【解决方案1】:

您的Scanner 构造函数可以抛出IOException,因为它正在调用setChar(),并且可以抛出它。

你必须要么声明你的构造函数抛出异常,要么在你的构造函数中捕获异常并处理它。

【讨论】:

  • 我在方法里处理过还以为没问题?
  • 啊,在这种情况下,您需要从该方法中删除throws IOException,因为它不能不抓住它并处理它就扔掉它。
  • 我在使用 setChar() try{ getNextChar(); } catch(IOException e) { System.exit(0); e.printStackTrace(); }
  • 您只需要一个 throws 子句来处理可以直接通过的异常,而不是您捕获的异常。
  • 哦,我明白了。好的,我只是从方法声明中取出“抛出”并保持 try/catch 并且它起作用了。这是有道理的 - 谢谢!
【解决方案2】:

您的构造函数中的setChar(); 会抛出IOException

因此,您必须在构造函数中捕获它,否则构造函数也必须抛出 IOException

但是,您甚至不需要在 setChar() 方法的声明之后添加 throws IOException,因为您在其中捕获了潜在的异常。

【讨论】:

    【解决方案3】:

    您的 setChar() 方法说它可以抛出 IOException,但您的第二个构造函数没有处理它。

    您要么需要更改 setChar() 方法签名以不引发异常(事实上,它不会引发 IOException),要么让构造函数来处理它,例如 ...

      public Scanner(String inString)
      {
          in = new BufferedReader(new StringReader(inString));
          done = false;
          try {
              setChar();
          } 
          catch (IOException ie){
              System.exit(1)
          }
      }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多