Thinking in java(六)

1.Throwable
a) 异常体系:
i. Error错误
ii. Exception异常
1. 编译时异常Exception
2. 运行时异常RuntimeException(Exception特殊子类):RuntimeException
如果在函数中抛出的RuntimeException,这时这种异常在编译的时候,编译器不会处理。只有运行代码的时候,如果真的发生了,这时程序就会因为这个异常而停止运行。
b) 总结:对于RuntimeException运行时异常,不需要捕获和声明。
为什么抛出RuntimeException异常,不需要捕获和声明呢?(声明和捕获没有什么影响),运行时异常就是为了让程序停止,让我们看到并且修正;
c)
RuntimeException和Exception有什么区别:
Exception属于编译时异常,编译器在编译时会检测该异常是否异常的处理方案
RuntimeException属于运行时异常,编译器不会检测该异常是否有异常的处理方案,不需要声明。
说明:在Exception的所有子类异常中,只有RuntimeException不是编译异常,是运行时异常,其他子类都是编译异常。

2.异常的声明和捕获
a) 注意:在开发中,main函数中不会出现声明,在main函数通常是使用捕获。(但是main函数是可以声明的)
b) Throw和throws的区别:
throw:(抛出异常)
throw书写在函数内,当在函数中有异常的时候,这个异常需要抛出,这时我们可以在函数中使用throw关键字把这个异常抛出。
throws:(声明异常)
throws是书写在函数上,当函数中有编译时期的异常时,我们同时又需要把这个异常告诉给函数的调用者,这时可以在函数上使用throws关键字声明函数中的异常。
c)异常的代码块:
1)try-catch代码块

try{
可能发生异常的代码
}catch( 异常类名  变量名 ){
处理异常的代码。
}

2)try-catch-catch代码块
当try代码块中可能有多个异常的时候,针对每个异常,需要分别进行捕获

try{
可能发生异常的代码
}catch( 异常类名  变量名 ){
    //处理
}catch( 异常类名  变量名 ){
    //处理
}
......

多catch分别捕获异常的时候,最上面的catch应该捕获的是子类的那个异常,最后的一个catch,一定捕获的需要捕获的异常的最后那个父类。

3.自定义的异常
自定义异常类是建立在java提供的异常类基础之上(必须继承java中的异常类)。也就是说我们自己定义的类要是异常类的话,要求我们的自己定义的类也必须是Throwable下的一个子类。
如果自己定义的异常,需要编译器在编译的时候检测,这时就继承Exception,如果编译的时候不需要检测,这时就继承RuntimeException。

4.异常在继承时
继承中的函数复写异常细节:
1、子类复写父类的函数,要求函数的返回值类型,函数名,参数列表必须一致;
2、子类复写父类的函数,子类中函数访问权限大于等于父类中函数的访问权限;
3、不能修改访问方式;
4、子类复写父类的函数时,如果父类的函数上没有声明异常,子类复写的时候,也不能声明异常

原文地址:https://www.cnblogs.com/DiZhang/p/12545077.html