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