异常的概念:
程序在运行时,发生了不可预测的事件,它阻止了程序按照我们程序员的预期
正常执行!
异常处理机制
能让程序在异常发生时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序恢复正常并继续执行。
所有异常和错误的父类--Throwable
Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。
根据编译器对异常的处理要求,异常分为两类:
运行时异常(RuntimeException):在程序运行期间产生的异常!
在编译期间是发现不了的,只有在程序运行时会出现错误
受查异常 (checked Exception) :在程序编译期间产生的异常!
在编译期间就开始出现的错误
异常处理方式分为两种:(5个关键字)
1.使用try..catch..finally
2.使用throw抛出异常和throws声明异常
try的使用
1.try块中放可能发生异常的代码
2.try不能单独使用,必须和catch或者finally中的其中一个联合使用;
3.如果执行完try并且不发生异常,则接着去执行finally代码块和finally后面的代码;
4.如果没有finally代码块,则直接执行catch之后的代码;
5.如果发生异常,则尝试去匹配对应异常的catch代码块。
catch的使用
1.每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类
2.catch后面的括号定义了异常类型和异常参数。
3..如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
4.可以书写多个catch代码块!顺序必须是按照异常类型从小到大!
5..如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally
7.Java7版本及以上可以将多个异常声明在一个catch中
finally的使用
1.无论异常是否发生,finally代码块都会执行;
2.如果try代码块中出现return,先执行finally代码块之后return;
3.finally不会执行的:遇到System.exit(0),不会执行finally代码块
throw和throws的使用
throw的使用
语法:
throw new 异常类型([异常提示语句]);
1.异常类型可以是Exception或者其子类;
2.一条throw语句只能抛出一个异常;
3.throw语句只能出现在方法体中
4.针对于thorw抛出的异常,有两种解决方式
throws的使用
语法:
方法名称 throws 异常类型1,异常类型2;
使用throws声明异常,把异常告诉调用者
1.thows声明在方法名称之后;
2.throws可以声明多个异常类型,每个类型之间使用 '逗号' 隔开;
3.throws声明表示当前方法可以不处理异常,而是由方法的调用者处理;
4.如果在主函数中使用throws声明异常,则由JVM处理异常!
异常链的使用
将捕获的异常包装进一个新异常,然后将新异常抛出。原异常被保存为新异常的一个属性(Cause),形成了异常链。
为什么要使用异常链
当发生异常时,程序员具有完整的异常堆栈跟踪,这对调试非常有用。
示列
异常链和自定义异常
首先创建一个包并在里面创建一mian方法来运行
和建立几个类。
这是其中的User的实体类
package exception; public class User { private String username; private String pwd; private String age; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
这是其中的UserException类
在这里要继承一个RuntimeException
package exception; public class UserException extends RuntimeException { //用于显示异常信息 public UserException(String message) { super(message); } public UserException() { } //用于保存根异常信息 public UserException(String message, Throwable cause) { super(message, cause); } }
这是其中的UserNameExceprion 类
在这里要继承一个UserException类
package exception; import exception.UserException; public class UserNameExceprion extends UserException { //用于显示异常信息 public UserNameExceprion(String message) { super(message); } public UserNameExceprion() { } //用于保存根异常信息 public UserNameExceprion(String message, Throwable cause) { super(message, cause); } }
这是其中的PasswordException 类
在这里要继承一个UserException类
package exception; public class PasswordException extends UserException{ //显示异常信息 public PasswordException(String message) { super(message); } public PasswordException() { } //用于保存根异常信息 public PasswordException(String message, Throwable cause) { super(message, cause); }
这是其中的Userage 类
在这里要继承一个UserException类
package exception; public class Userage extends UserException { //用户显示异常信息 public Userage(String message) { super(message); } public Userage() { } //用于保存根异常信息 public Userage(String message, Throwable cause) { super(message, cause); } }
这是其中的Text类
此类用于实验
package exception; public class Text { public static void main(String[] args) { try { //调用用户异常方法来实现异常链 userName(); }catch (UserNameExceprion e){ e.printStackTrace(); } } //用户异常 private static void userName() throws UserNameExceprion { try { userpwd(); }catch (PasswordException e){ throw new UserNameExceprion("用户名异常",e); } } //密码异常 private static void userpwd() throws PasswordException { try { userage(); }catch (Userage e){ throw new PasswordException("密码异常",e); } } //年龄异常 private static void userage()throws Userage { throw new Userage("年龄异常"); } }
运行效果
在这里出现了Caused by就表示异常链