Java 异常类别是选中的还是未选中的异常?
Java说除了Java 异常类别是选中的还是未选中的异常?,java,exception,Java,Exception,Java说除了RuntimeException和Error之外,Throwable的所有子类都是检查异常。这还包括java.lang.Exception类,它是java.lang.Throwable的直接子类 未检查的异常类是运行时异常类和错误类 选中的异常类是除未选中的异常类之外的所有异常类。也就是说,选中的异常类都是Throwable的子类,而不是RuntimeException及其子类和Error及其子类 捕获未在try块中抛出的已检查异常时,仅对exception的子类给出编译错误,而不
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子句可能由某个接口或超类指定)
- 如果您声明
,那么它将处理该方法,就像它只抛出检查过的异常一样(即,您必须捕获它们),但由于这可能也包括抛出异常
,因此它无法警告您未抛出异常运行时异常
异常的子类
,而不是异常
本身提供编译错误。这是为什么?”(我现在删除的答案也不是。)几周前看到过同样的问题。。。搜索-并找到@艺术-好发现@艺术谷歌和
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
}
}
}