【问题标题】:unreported exception handling in javajava中未报告的异常处理
【发布时间】:2013-07-04 16:10:39
【问题描述】:

我是Java初学者,知道try...catch语句是用来处理异常的;表示当try 块抛出异常时,将执行catch 块。所以,我的问题是,当我尝试以下代码(没有try catch)时,它会在read() 方法中抛出一个未报告的IOException,但是当我使用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 块?我是不是搞错了。

【问题讨论】:

  • 未报告是什么意思??
  • 可能是该输入从未引发异常!
  • 你是说在运行程序时抛出了异常,还是说编译器在尝试编译程序时抱怨没有捕获到异常??
  • (提示:报告 SO 上的问题时,总是复制/粘贴您收到的 exact 错误消息。并且在报告 Java 异常时确保至少还包括堆栈跟踪的前 10 行左右。)

标签: java exception exception-handling


【解决方案1】:

编译器告诉你异常可能被抛出,你必须迎合这种可能性。

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

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

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

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

new URL(potentiallyDubiousUserInput);

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

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

请参阅this question/answer 了解更多信息。

【讨论】:

  • 在某些情况下,必须将其放在 try-catch 块之间可能会导致一点性能成本:stackoverflow.com/questions/16451777/…
  • 我认为静态分析是解释我的问题的真正术语。那就是编译器可能认为用户可以输入任何整数或其他不需要的东西。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多