Java异常体系


Java异常体系

  Java中把容易出现的异常情况都封装成了对象,这些对象就构成了Java异常体系。

1 Java异常体系结构

  -java.lang.Object

    -java .lang.Throwable

      -java.lang.Error

      -java.lang.Exception

1.1 Throwable

  所有异常和错误的超类,只有当对象是此类及其子类的实例时,才能通过Java虚拟机或者Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

  Throwable中的方法:

    -getMessage():获取异常信息,返回字符串。

    -toString():获取异常类名和异常信息,返回字符串。

    -printStackTrace():输出异常类名和异常信息,以及异常出现在程序中的位置。

    -printStackTrace(PrintStream s):通常用该方法将异常内容输出到日志文件中,以便查看,类似于重定向。

1.2 Error

  通常指程序中出现了重大问题,例如运行的类不存在或者内存溢出等。不编写针对代码对其处理。

1.3 Exception

  程序在运行时出现的异常情况,可以通过try...catch...finally捕获解决。

1.4 关键字throws和throw的区别

  -throws:用在方法上,后面跟异常的类名,用于声明异常,标识方法会暴露出的异常。在定义方法时,需要把会出现的问题暴露出来让调用者去处理,就用throws在方法上标识出来。

  -throw:用在方法内,后面跟异常对象,用于抛出异常对象,相当于new一个异常对象。在方法内 出现某种情况,使程序不能继续运行,需要进行跳转时,用throw把异常对象抛出。

2 try...catch...finally

 try {
           //需要检测的代码
       }catch (异常类 变量名){ //(Exception e) 或 (Throwable e)
           //异常处理代码
       }finally {
           //最终都会执行的代码
       }

  -finally代码块只有一种情况不会被执行:那就是在finally之前执行了System.exit(0)。finally代码块通常用来关闭资源(数据库连接,IO流等)。

  -try是一个独立的代码块,在try中定义的变量只能在try块中使用,如果想在try块外使用,则需在try外建立引用,在try中初始化。

  -catch语句可以定义多个,但子类异常需要先catch,否则代码不可达,编译不通过。

  -方法在重写时,不能抛出新的异常类型,只能抛出原有异常类型及其子类。

3 自定义异常

自定义异常步骤:

  -自定义类继承Exception或其子类。

  -通过构造函数定义异常信息。

例:自定义AgeTooSmallException和AgeTooBigException异常,当一个人的年龄不合法时,抛出该异常。

package com.yss.gyg.exception;

public class AgeTooSmallException extends Exception {

    public AgeTooSmallException() {
    }

    public AgeTooSmallException(String message) {
        super(message);
    }
}
AgeTooSmallException
package com.yss.gyg.exception;

public class AgeTooBigException extends Exception {

    public AgeTooBigException() {
    }

    public AgeTooBigException(String message) {
        super(message);
    }
}
AgeTooBigException
package com.yss.gyg.test;

import com.yss.gyg.exception.AgeTooBigException;
import com.yss.gyg.exception.AgeTooSmallException;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws AgeTooSmallException, AgeTooBigException {
        if (age < 0) {
            throw new AgeTooSmallException("年龄小于0,不合法");
        }
        if (age > 200) {
            throw new AgeTooBigException("年龄大于200,不合法");
        }
        this.age = age;
    }
}
Person
package com.yss.gyg.test;

import com.yss.gyg.exception.AgeTooBigException;
import com.yss.gyg.exception.AgeTooSmallException;

public class TestException01 {
    public static void main(String[] args) {

        Person p = new Person();
        try {
            //p.setAge(-1);
            p.setAge(201);
        } catch (AgeTooSmallException e) {
            e.printStackTrace();
        } catch (AgeTooBigException e) {
            e.printStackTrace();
        }


    }


}
/*com.yss.gyg.exception.AgeTooBigException: 年龄大于200,不合法
    at com.yss.gyg.test.Person.setAge(Person.java:35)
    at com.yss.gyg.test.TestException01.main(TestException01.java:12)*/
TestException01