0

我是Java初学者,知道try...catch语句是用来处理异常的;表示当块抛出异常时trycatch块被执行。所以,我的问题是当我尝试下面的代码(没有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");
        }
    }
}

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

4

3 回答 3

8

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

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

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

new URL("http://www.stackoverflow.com");

编译器会坚持让我捕捉到MalformedURLException。很明显,URL 很好,但编译器会警告我,因为我可以URL使用以下方法构造对象:

new URL(potentiallyDubiousUserInput);

我不能保证那个字符串potentiallyDubiousUserInput会是什么。

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

有关更多信息,请参阅此问题/答案

于 2013-07-04T16:12:59.780 回答
1

您必须区分(并清楚地告诉我们,这样我们就不必把它弄糊涂了)编译器告诉您的内容和运行时发生的事情。

在您的情况下,如果没有 try-catch,编译器会告诉您read() 可能会抛出,并且您必须以某种方式处理异常。这就是您通过添加 try-catch 所做的。

但是,当您随后运行该程序时,它实际上并没有抛出(一般来说,该程序不太可能抛出),因此它从未进入 catch 块。

于 2013-07-04T16:14:55.927 回答
0

这是因为System.in.read()可以抛出 IOException ,这是一个已检查的异常。正如JLS 11.2.3中提到的关于检查的异常:

如果当 E 是已检查的异常类并且 E 不是在方法或构造函数的 throws 子句中声明的某个类的子类时,方法或构造函数主体可以抛出某个异常类 E,则这是编译时错误。

于 2013-07-04T16:44:28.597 回答