关于Java异常处理的整理说明
一、异常的体系结构
1. |-------Throwable:
|------Error: 发生的异常是没有办法使用针对性的一些代码去解决的
|------Exception: 可以通过一些针对性的代码进行处理
|------运行时异常 :代码在运行时发生的异常(java 字节码文件)
ArithmeticException : 算术运算异常
|------编译时异常 :代码在编译时发生的异常(javac 源文件名.java)
FileNotFoundException: 文件找不到异常
2. 抓抛模型 :
①抛(制造异常):当程序在执行的过程中,如果执行到某行代码时发生了异常,那么系统就会根据对应的异常类创建异常对象并抛出。同时终止程序的运行。
方式一:系统向外抛异常
方式二:手动向外抛异常(throw)
②抓(处理异常):
方式一 :try-catch-finally
方式二 : throws
二、处理异常方式一
/*
方式一 :try-catch-finally
格式:
try{
可能发生异常的代码
}catch(异常的类型1 变量名){
异常的处理方式1
}catch(异常的类型2 变量名){
异常的处理方式2
}
........
finally{
一定会执行的代码
}
说明:
1. 当try中的代码发生异常时,系统会创建对应的异常对象并抛出。
抛出的异常对象的类型会和catch中异常的类型进行匹配,
一旦匹配成功则执行相应的异常处理代码。执行完后跳出try-catch结构,继续向下执行。
一旦匹配失败则抛出异常终止程序。
2. catch可以有多个,但是catch中的异常类型一旦存在子父类关系,那么子类在上父类在下。
3.finally中的代码一定会执行(无论是否catch到了异常都会执行)
4.try-catch-finally try-catch try-finally
5.异常处理方式 getMessage() printStackTrace()
注意 :
1.编译时异常 :必须处理否则程序不能执行。
2.运行时异常一般情况下我们都不处理。
*/
三、处理异常方式二
/*
处理异常方式二 :throws
格式 : (形参列表) throws 异常类型1,异常类型2 ......{}
说明: throws是抓到异常后向上抛,抛给方法的调用者来处理该异常。(谁调用该方法处理该异常)
throws和try-catch-finally的区别?
throws并没有真正的处理掉异常,而是将异常向外抛,抛给方法的调用者处理。
try-catch-fianlly:真正的处理掉了异常
1.什么时候必须使用throws?
如果是因为传入的数据导致的异常,那么在整个传参过程中的所有方法都不能对该异常进行try-catch
只能throws。最终还是由传数据的那个方法进行try-catch解决。
2.什么时候不能使用throws?
①如果需要真正的处理掉异常那么不能使用throws
②如果父类被重写的方法没有throws那么子类重写的方法也不能throws
*/
class MyException{
public void setAge(int age) throws FileNotFoundException{
}
}
四、手动抛异常
/*
格式: throw new 异常的类型
throw 异常类型的对象
*/
class MyException{
public void setAge(int age){
if(age < 0){
throw new RuntimeException("不能小于0");//抛的是运行时异常
}
}
public void setAge2(int age)throws Exception{
if(age < 0){
throw new Exception("不能小于0");//抛的是编译时异常
}
}
}
五、自定义异常类
/*
自定义异常类:
步骤:
1.自定义一个类并继承Exception(编译时异常类)/RuntimeException(运行时异常类)
2.写两个构造器:一个空参的,一个有参的
3.显示提供一个serialVersionUID(可以不写系统会自动提供一个serialVersionUID)
*/
public class MyException extends RuntimeException{
//显示提供一个serialVersionUID(可以不写系统会自动提供一个serialVersionUID)
static final long serialVersionUID = 532323232323L;
public MyException(){
}
public MyException(String message){//异常的信息说明
super(message);//调用父类的构造器
}
}