异常概念
英文Exception,所谓异常处理,就是指程序在出现问题时依然可以正确的执行完毕。
java面向对象处理异常过程
抛出异常:在执行方法时,如果发生异常,则方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE
- 捕获异常:JRE得到异常后,寻找相应的代码来处理该异常JRE在方法的调用栈中查找,从生成异常的方法开始回溯,知道找到相应的异常处理代码为止
异常分类
CheckedException
编译期必须要处理的,通过try catch finally语法结构来处理,finally语句一定执行
// 测试try catch语句用法
public static void testTryCatchFinally(){
FileReader reader = null;
try{
reader = new FileReader("d:/a.txt");
char c1 = (char)reader.read();
char c2 = (char)reader.read();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally {
if(reader != null){
try{
reader.close()
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
// 测试声明式抛出异常,例如Dateformat类中的parse方法会抛出ParseException
// 声明式异常可直接通过try catch语句处理 或者继续声明式抛出异常
public static testDeclareException() throws ParseException{
Dateformat df = new Dateformat("yyyy-MM-dd");
String str = "2049-10-1"
Date d = df.parse(str);
}
// 测试try-with-resource 可以自动关闭实现了AutoClosable接口的类
// 编译器语法糖 底层还是try catch finally
// 下例和第一例效果一致,reader是实现了AutoClosable接口的类的实例
public static void testTryCatchFinally(){
try(FileReader reader = new FileReader("d:/a.txt")){
char c1 = (char)reader.read();
char c2 = (char)reader.read();
}catch(Exception e) {
e.printStackTrace();
}
}
RuntimeException
含return异常处理方式
try catch语句含return语句,会在任何执行try中的return语句之前,都会先执行finally语句,finally中有return语句的话,直接return
可视化bug追踪
自定义异常
自定义异常只需要从Exception类或者他的子类派生一个子类即可
- 自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类
- 习惯上自定义异常类应该包含2个构造器,一个是默认构造器,一个是带有详细信息的构造器
```java
public class TestException {
public static void main(String[] args) throws Exception {
} }Person p = new Person();
p.setAge(-1);
System.out.println(p.getAge());
class IllegalAgeException extends Exception{ // 默认无参构造器 public IllegalAgeException() {}; public IllegalAgeException(String message) { super(message); } }
class Person{ private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws IllegalAgeException {
if (age < 0){
throw new IllegalAgeException("年龄不得小于零岁");
} else {
this.age = age;
}
}