异常是一种提醒机制,识别和响应错误情况的机制,提高代码的健壮性,易于调试
Throwable是所有异常类的父类
1.try...catch...
语法:try{可能发生错误的代码块}catch(异常类型 变量){异常处理方案}
jdk1.7之后,可以写成try(资源开启语句;){高风险代码}catch(异常类型 变量){ 处理措施}
try处理异常一般常在客户端
try {
//这里发生异常,则try之后的代码都不会执行
FileInputStream fis = new FileInputStream("");
} catch (FileNotFoundException e) {
//打印错误信息和栈帧,一般用于程序员排错
e.printStackTrace();
//获取异常信息,一般返回给客户端
e.getMessage();
}
//try...catch...不会让程序出现异常而终止
System.out.println("=--=--=--=--=");
//可以有多个catch,多个catch的异常类型之间不是父子关系就是没有继承关系
try {
int[] ints = null;
ints[0] = 1;
FileInputStream fis = new FileInputStream("");
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(NullPointerException e) {
e.printStackTrace();
}
//也可以让多个异常用 | 分开,这样写异常类型之间不能有继承关系,有继承关系就写父类
try(FileInputStream fis1 = new FileInputStream("");
){
int[] ints = null;
ints[0] = 1;
}catch(IOException | NullPointerException e){
e.printStackTrace();
}
finally用于异常处理中,和try或者try...catch...一起使用,不论try里面是否发生异常,都会执行finnally里面的代码。finnally和catch里面都有return时,最后执行返回的是finnally里面的return。
2.throws
throws抛出异常,一般常用于服务端,并不会进行处理,会把问题抛给上家
当调用的方法抛出了异常时,调用处需要进行异常处理或者抛出异常,throws可抛出多个异常,之间逗号分隔
throw会抛出一个异常对象,并终止程序,谁调用throw的方法,就会抛给谁异常
public static void main(String[] args) throws FileNotFoundException {
// FileInputStream fis = new FileInputStream("");
System.out.println("执行");
// throw用于抛出一个具体的异常对象,终止程序
try {
m1();
System.out.println("这里将不执行");
} catch (CustomizeException e) {
e.printStackTrace();
// System.err.println(e.getMessage());
}
}
public static void m1() throws CustomizeException {
// 谁调用我,我就抛给谁异常,调用方法处
throw new CustomizeException("自定义异常");
}
补充:重写需要子类不能抛出更宽泛的异常-->子类方法抛出的异常要比父类抛出的异常相同或者是其子类,或者没有异常。
3.自定义异常
自定义异常,只需要定义一个类并继承一个已知的异常类,并加两个公共的构造方法,一个有参构造方法,将错误信息传递给父类,一个无参构造方法。
Exception异常是编译时异常,运行时异常不需要对可能报错的代码进行预异常处理
public class CustomizeException extends Exception{
public CustomizeException() {
super();
}
public CustomizeException(String message) {
super(message);
}
}