Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常类别是选中的还是未选中的异常?_Java_Exception - Fatal编程技术网

Java 异常类别是选中的还是未选中的异常?

Java 异常类别是选中的还是未选中的异常?,java,exception,Java,Exception,Java说除了RuntimeException和Error之外,Throwable的所有子类都是检查异常。这还包括java.lang.Exception类,它是java.lang.Throwable的直接子类 未检查的异常类是运行时异常类和错误类 选中的异常类是除未选中的异常类之外的所有异常类。也就是说,选中的异常类都是Throwable的子类,而不是RuntimeException及其子类和Error及其子类 捕获未在try块中抛出的已检查异常时,仅对exception的子类给出编译错误,而不

Java说除了
RuntimeException
Error
之外,
Throwable
的所有子类都是检查异常。这还包括
java.lang.Exception
类,它是
java.lang.Throwable
的直接子类

未检查的异常类是运行时异常类和错误类

选中的异常类是除未选中的异常类之外的所有异常类。也就是说,选中的异常类都是Throwable的子类,而不是RuntimeException及其子类和Error及其子类

捕获未在try块中抛出的已检查异常时,仅对
exception
的子类给出编译错误,而不是对
exception
本身给出编译错误。为什么呢

这是否意味着
java.lang.Exception
未选中

而这可以很好地编译和运行

public class CheckedExceptionTest {
    public static void good(){ System.out.println("I am good"); }

    public static void main(String []args){
        try {
            good();
        } catch (java.lang.Exception e) { 
            // No compile error
        }
    }
}

必须声明或捕获任何已检查异常,因此编译器知道某些代码段可以抛出哪些已检查异常

如果一个方法只抛出选中的异常
MySpecialException
,那么您只需要捕获它,如果它将声明
抛出异常
,那么您必须捕获
异常

但是,使用泛型
抛出异常
捕获(异常e)
很少是一个好主意,因此无论如何都应该使用更具体的异常


另一方面,由于编译器知道在try块中可以抛出哪些选中的异常,因此它能够告诉您永远不会执行的catch块。但是,对于未检查的异常,情况并非如此

那么为什么编译器抱怨
catch(IOException)
,而不是
catch(Exception)
?这是因为
IOException
始终是一个已检查的异常,因此编译器知道它不能被抛出
Exception
也可能意味着
RuntimeException
,因此
catch(Exception)
也将捕获这些异常(如果有)

异常
本身的处理方式因其使用位置而异:

  • 抛出异常
    抛出新异常(…)
    告诉编译器必须处理选中的异常
  • catch(Exception)
    告诉编译器应该处理任何异常,即选中或未选中,并且由于未选中的部分,编译器不能抱怨
请注意,编译器将以不同的方式处理
抛出异常
,例如
抛出IOException
,原因相同:

  • 如果您声明要在方法中抛出一个特殊的已检查异常,但它没有发生,那么编译器可以就此向您发出警告(这通常只是一个警告,因为throws子句可能由某个接口或超类指定)
  • 如果您声明
    抛出异常
    ,那么它将处理该方法,就像它只抛出检查过的异常一样(即,您必须捕获它们),但由于这可能也包括
    运行时异常
    ,因此它无法警告您未抛出异常

必须声明或捕获任何已检查异常,因此编译器知道某些代码可以抛出哪些已检查异常

如果一个方法只抛出选中的异常
MySpecialException
,那么您只需要捕获它,如果它将声明
抛出异常
,那么您必须捕获
异常

但是,使用泛型
抛出异常
捕获(异常e)
很少是一个好主意,因此无论如何都应该使用更具体的异常


另一方面,由于编译器知道在try块中可以抛出哪些选中的异常,因此它能够告诉您永远不会执行的catch块。但是,对于未检查的异常,情况并非如此

那么为什么编译器抱怨
catch(IOException)
,而不是
catch(Exception)
?这是因为
IOException
始终是一个已检查的异常,因此编译器知道它不能被抛出
Exception
也可能意味着
RuntimeException
,因此
catch(Exception)
也将捕获这些异常(如果有)

异常
本身的处理方式因其使用位置而异:

  • 抛出异常
    抛出新异常(…)
    告诉编译器必须处理选中的异常
  • catch(Exception)
    告诉编译器应该处理任何异常,即选中或未选中,并且由于未选中的部分,编译器不能抱怨
请注意,编译器将以不同的方式处理
抛出异常
,例如
抛出IOException
,原因相同:

  • 如果您声明要在方法中抛出一个特殊的已检查异常,但它没有发生,那么编译器可以就此向您发出警告(这通常只是一个警告,因为throws子句可能由某个接口或超类指定)
  • 如果您声明
    抛出异常
    ,那么它将处理该方法,就像它只抛出检查过的异常一样(即,您必须捕获它们),但由于这可能也包括
    运行时异常
    ,因此它无法警告您未抛出异常

@Arty-好发现@谷歌和谷歌的艺术搜索没有帮助。感谢您的链接。虽然我不确定副本是否解决了您的问题“捕获未在try块中抛出的已检查异常只为
异常的子类
,而不是
异常
本身提供编译错误。这是为什么?”(我现在删除的答案也不是。)几周前看到过同样的问题。。。搜索-并找到@艺术-好发现@艺术谷歌和
public class CheckedExceptionTest {
    public static void good(){ System.out.println("I am good"); }

    public static void main(String []args){
        try {
            good();
        } catch (java.lang.Exception e) { 
            // No compile error
        }
    }
}