java中未报告的异常处理

dar*_*rix 0 java exception-handling exception

我是Java初学者,并且知道try...catch语句用于处理异常; 表示当try块抛出异常时,catch执行块.所以,我的问题是,当我尝试下面的代码(没有try catch)它抛出一个未报告IOExceptionread()方法,但当我使用 try catch 它工作正常.

try块中出现上述异常并exception occured打印时,为什么控件不会转移到catch语句?这是我的代码:

class Test00 {
    public static void main(String args[]) {
        char ch;

        try {
            ch=(char)System.in.read();//here exception is thrown without using try..catch
            System.out.println(ch);
        } catch(Exception e) {
            System.out.print("exception occured");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为编译器会抛出一个异常,这就是代码与try catch一起工作的原因.但是为什么不执行catch块呢?我得错了.

Bri*_*new 8

编译器告诉您可能抛出异常,并且您必须满足这种可能性.

编译器正在对您的代码进行静态分析.它无法分辨代码在实践中如何实际运行.

这可能令人沮丧.例如,如果我写:

new URL("http://www.stackoverflow.com");
Run Code Online (Sandbox Code Playgroud)

编译器将坚持我捕获MalformedURLException.很明显URL很好,但编译器警告我,因为我可以URL使用以下方法构造一个对象:

new URL(potentiallyDubiousUserInput);
Run Code Online (Sandbox Code Playgroud)

我无法保证该字符串potentiallyDubiousUserInput是什么.

这些被称为已检查的异常,您必须处理它们(捕获或声明它们被进一步抛出).它们可能很痛苦,您会在Scala等语言中看到所有异常都未经检查.也就是说,您没有明确地处理它们.

有关详细信息,请参阅此问题/答案.