加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么在尝试编写catch时应该有异常抛出的可能性?

发布时间:2020-12-15 05:08:33 所属栏目:Java 来源:网络整理
导读:我正在玩一些异常程序,并遇到了一些我以前从未遇到过的惊喜. import java.io.*;class ExceptionTest{ public static void main(String[] args) { try { System.out.println("hello"); } catch(IOException ioe) { System.err.println("ioexception was throw
我正在玩一些异常程序,并遇到了一些我以前从未遇到过的惊喜.

import java.io.*;

class ExceptionTest
{
  public static void main(String[] args)
  {
    try
    {
      System.out.println("hello");
    }
    catch(IOException ioe)
    {
      System.err.println("ioexception was thrown!!");
    }
  }
}

这会引发编译器错误:

ExceptionTest.java:10: exception java.io.IOException is never thrown in body of
corresponding try statement
catch(IOException ioe)
^
1 error

我的问题是为什么会这样?

为什么编译器担心它肯定永远不会达到的代码片段.它可能只是一个警告,而不是一个完整的错误.毕竟我们可能希望保留catch块作为我们可能进行的一些未来更改的备份,或者程序员在一些编辑后忘记删除它.

我知道我知道它可以避免不必要的击键等等.但它不应该麻烦编译器引起错误.还是有其他原因吗?

代码中的IOException catch块也会产生编译器错误,但Exception catch块不会……为什么会这样?
Thnx提前!!

解决方法

因为Java设计者认为系统应该以这种方式提供帮助.这与以下情况相同:

public class EarlyReturn {
    public void foo() {

        return;

        System.out.println("Hi");
    }
}

…这也导致编译时错误.永远不会运行的代码是一件坏事,编译器通过让我们知道它永远不会运行来帮助我们,设计师认为它应该是一个错误而不是一个警告.

如果你愿意的话,你可以改变你的代码来捕获Exception而不是IOException,但是虽然这会让编译器让你这么做,但你仍然会有永远不会运行的代码(这也是一件坏事).

Also an IOException catch block in the code produces an compiler error but an Exception catch block does not… why is that??

IOException是一个经过检查的异常,只有以这种方式检查已检查的异常(这就是为什么要调用它们).有检查的异常,未经检查的异常(RuntimeException及其子类)和错误(错误及其子类).从技术上讲,已检查的异常是所有不是未经检查的异常或错误的异常(Section 11.1.1 of the JLS),但是 – 这是一个黑暗的角落 – 并未检查所有已检查的异常.具体来说,检查已检查的异常,除非它们是Exception或它的超类.从Section 11.2.3 of the JLS开始:

It is a compile-time error if a catch clause can catch checked exception class E1 and it is not the case that the try block corresponding to the catch clause can throw a checked exception class that is a subclass or superclass of E1,unless E1 is Exception or a superclass of Exception.

第11节的全部内容可能值得一读.正如你可以猜到的那样,这是Java的一部分,在早期发展得相当多,导致这个有些复杂的定义被检查的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读