概念
程序在运行过程中出现的特殊情况。
异常处理的必要性
任何程序都可能存在大量的未知问题、错误;如果不对这 些问题进行正确处理,则可能导致程序的中断,造成不必要的损失
异常的体系
throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
Error: JVM、硬件、执行逻辑错误,不能手动处理
Exception:程序在运行和配置中产生的问题,可处理
RuntimeException:运行时异常,可处理,可不处理
CheckedException:受查异常,必须处理。
JVM默认处理异常的方式
如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行
常见异常处理结构
•try{ } catch{ }
• try{ } catch{ } catch{ }
• try{ } catch{ } finally{ }
• try{ } catch{ } catch{ } finally{ }
• try{ } finally{ }
eg:对try,catch,finally的解释
程序从 try 里面的代码开始执行
出现异常,就会跳转到对应的 catch 里面去执行
执行完毕之后,程序还可以继续往下执行
throws方式处理异常
public void 方法() throws 异常类名 {
}
这个throws格式是跟在方法的括号后面的
编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案, 将来谁调用谁处理
运行时异常可以不处理,出现问题后,需要我们回来修改代码
throw 和throws的区别
自定义异常
概念:需继承Exception或Exception的子类,代表特定问题
eg:
public class MyException {
public static void main(String[] args) {
Person p = new Person();
p.setName(null);
p.setId("1234567896768");
System.out.println(p);
}
}
public class NameException extends RuntimeException{
public NameException(String msg){
super(msg);
}
}
public class Person {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
if(name==null){
throw new NameException("name must not null");
}
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
}
注意点
带有异常声明的方法重写:
子类中的方法,不能抛出比父类更多、更宽的异常