为什么我会收到"未处理的异常类型IOException"?

Rom*_*man 33 java stdin readline ioexception

我有以下简单的代码:

import java.io.*;
class IO {
    public static void main(String[] args) {    
       BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));    
       String userInput;    
       while ((userInput = stdIn.readLine()) != null) {
          System.out.println(userInput);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

----------
1. ERROR in io.java (at line 10)
    while ((userInput = stdIn.readLine()) != null) {
                        ^^^^^^^^^^^^^^^^
Unhandled exception type IOException
----------
1 problem (1 error)roman@roman-laptop:~/work/java$ mcedit io.java 
Run Code Online (Sandbox Code Playgroud)

有人有什么想法吗?我只是想简化总和网站上给出的代码(这里).我过度简化了吗?

Mar*_*cin 53

您应该在主方法中添加"throws IOException":

public static void main(String[] args) throws IOException {

您可以在JLS中阅读有关已检查异常(特定于Java)的更多信息.


jkf*_*kff 45

Java有一个称为"已检查异常"的功能.这意味着,有一定类型的异常,即那些子类异常,但不是RuntimeException的,例如,如果一个方法可能引发他们来说,必须在其抛出的声明一一列举了,说:孔隙READDATA()抛出IOException异常.IOException就是其中之一.

因此,当您调用在其throws声明中列出IOException的方法时,您必须在您自己的throws声明中列出它或捕获它.

存在检查异常的基本原理是,对于某些类型的异常,您不能忽略它们可能发生的事实,因为它们的发生是非常常见的情况,而不是程序错误.因此,编译器可以帮助您不要忘记引发此类异常的可能性,并要求您以某种方式处理它.

但是,并非Java标准库中所有已检查的异常类都符合此基本原理,但这是一个完全不同的主题.


Par*_*rth 11

请尝试使用此代码段:

import java.io.*;

class IO {
    public static void main(String[] args) {    
        try {
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));    
            String userInput;    
            while ((userInput = stdIn.readLine()) != null) {
                System.out.println(userInput);
            }
        } catch(IOException ie) {
            ie.printStackTrace();
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

使用try-catch-finally比使用更好throws.使用时,查找错误和调试更容易try-catch-finally.