异常
异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序
异常处理
try/catch
.....
try{
//有可能发生异常的代码
}catch(异常类型 e){
//若发生异常,catch负责捕获(匹配)并处理异常
//若没有发生异常,则跳过catch
}
.....
Exception是所有异常类的直接或间接父类
异常类型不匹配时,程序中断运行
try/catch/finally
.....
try{
//有可能发生异常的代码
}catch(异常类型 e){
//若发生异常,catch负责捕(匹配)并处理异常
//若没有发生异常,则跳过catch,执行finally
}finally{
//finally 用于进行收尾工作(关闭数据库、文件,释放内存等资源)
}
.....
不管是否发生异常,finally都执行
执行finally前,system.exit(0) 正常退出jvm,finally不会执行
catch可以省略,变成try/finally块
return在try/catch/finally块中的执行顺序
顺序执行后返回执行return
异常的分类
Throwable类是 Java 语言中所有错误(Error)或异常(Exception)的父类
Error类表示错误类。仅靠程序本身无法恢复的严重错误
Exception 类表示异常类,可以通过java 异常处理机制处理。
异常分为两种情况
RuntimeException: 运行时异常。不要求程序必须做出处理。是所有运行时异常的父类。
CheckedException: 检查时异常。要求程序必须处理,不处理编译不通过。
运行时异常和检查时异常的区别
运行时异常:包括RuntimeException及其所有子类。不要求程序必须对它们作出处理,比如InputMismatchException、ArithmeticException、NullPointerException等。即使没有使用try-catch或throws进行处理,仍旧可以进行编译和运行。如果运行时发生异常,会输出异常的堆栈信息并中止程序执行。
Checked异常(非运行时异常):除了运行时异常外的其他异常类都是Checked异常。程序必须捕获或者声明抛出这种异常,否则出现编译错误,无法通过编译。
声明异常
一个方法可能存在异常,而此时自身又无法更好的处理,可以交给外界处理。此时用throws声明并抛出异常。
如:public staticint div(inta,int b) throws ArithmeticException{
}
用throws声明后,调用处需要处理该异常,若是不知道如何处理异常,可继续声明异常,这个过程称为异常上抛
声明异常和方法重载的关系
方法重载与声明异常无关
声明异常和方法重写的关系
1.父类方法声明了异常,子类可不声明任何异常
可以认为父类方法抛出异常,子类在重写过程中把该异常处理掉了,所以子类方法不用声明异常。
2.父类声明了异常(检测时或运行时),子类声明完全一样的异常
手动抛出异常
除了系统自动抛出异常外,有些问题需要开发者手动抛出异常。
而手动抛出异常需要使用关键字throw
public class Student {
private String name;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) throws Exception{
if(gender.equals("男") || gender.equals("女")) {
this.gender = gender;
}else {
throw new Exception("性别不合法!");
}
}
public Student(String name, String gender) {
super();
this.name = name;
this.gender = gender;
}
public Student() {
super();
}
}
--------------------------------------------
public class Test01 {
public static void main(String[] args){
Studentstu = new Student();
stu.setName("二狗");
try {
stu.setGender("xxx");
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
自定义异常
如果开发者需要手动抛出的异常在系统不存在,可以自定义异常。
如果要自定义异常,首先要确定异常类型,如果异常是运行时异常,必须继承RuntimeException或其子类;如果异常是检查时异常,必须继承Exception或其子类。
异常的命名方式,参考系统命名方式,以Exception结尾。
public classAgeExceptionextends Exception{
public AgeException(){
super();
}
publicAgeException(Stringmessage) {
super(message);
}
}