1 基本概括
2 主要介绍
2.1 异常的概念
什么是异常
指程序在运行过程中,出现的非正常的情况,最终会导致java虚拟机(jvm)的非正常停止。
异常如何处理
当异常出现时,执行预先准备好的程序
异常处理必要性
减少用户的损失、同时也减少给用户带来的不必要的麻烦;也可以利用异常处理给与用户一些提示
异常机制的概述
异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。
(1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。
(2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。
(3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。
2.2 异常产生的原因
自动产生异常
产生原因
程序运行过程中,遇到错误的代码,自动产生异常
结果
程序中一旦出现异常,程序不能继续执行之后的代码,则程序被终止掉
手动产生异常
关键字
throw
语法
修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{
// 方法的实现部分
}
位置
定义在方法内部
结果
作用效果类似于 return语句,终止当前方法、函数;程序运行时因异常而被终止掉
2.3 异常的传递
Java中的异常沿着方法的调用链进行反方向进行传递,最终传递给JVM
2.4 异常的处理
2.4.1 消极处理异常(声明异常)
关键字
throws
位置
在方法声明处
语法
修饰符 返回值类型 方法名(形参列表)throws 异常 的类名1,异常类名2{
// 方法的实现部分
}
消极处理异常时,可以利用其父类型的异常进行处理
结果
消极处理异常只是推卸责任,最终将责任推卸给JVM,程序最终还是因异常而被终止
作用
消极处理异常可以让非运行时异常在编译时通过
2.4.2 积极处理异常
语法
try{
// 可能出现异常的语句
}catch(异常类名 e){
// 异常出现执行的语句
}
try…catch常用的语法
1 try…catch结构,一旦异常出现try…catch 才起作用
2 try后面可以跟多个 catch结构,一旦try中出现异常,则从 上往下依次进行匹配catch,直到匹配成功
3 catch中可以利用父类型捕获:本类+所有的子类型的异 常,体现多态
4 子类型 的 catch 需要定义在 父类型的 catch前面
5 catch中 智能定义 try中可能出现的非运行时异常; catch中 可以定义任意的运行时异常,即使try中不可能出现 此类运行时异常
2.5 五个关键字
Java异常处理的五个关键字:try、catch、finally、throw、throws
2.5.1 throw关键字作用
可以使用throw关键字在指定的方法中抛出指定的异常
使用格式:
throw new xxxException("异常产生的原因");
注意:
1 throw关键字必须写在方法的内部
2 throw关键字后边new的对象必须是Exception或者Exception的子类对象
3 throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
4 throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
5throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch
2.5.2 throws声明异常
throws关键字:异常处理的第一种方式,交给别人处理作用:
1 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象
2 可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理-->中断处理
使用格式:在方法声明时使用
修饰符 返回值类型 方法名(参数列表) throws AAAException ,BBBException...{
throw new AAAException("产生原因");
throw new BBBException("产生原因");
}
注意:
1 throws关键字必须写在方法声明处
2 throws关键字后边声明的异常必须是Exception或者是Exception的子类
3 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
4 如果抛出的多个异常对象有父子类关系,那么直接声明父类异常即可
5 调用了一个声明抛出异常的方法,我们就必须处理这个异常对象
要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
要么try...catch自己处理异常
2.5.3 捕获异常try...catch
try...catch:异常处理的第二种方式,自己处理异常
格式:
try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,在异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){
}
注意:
1 try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
2 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码
如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码Throwable类中定义了3个异常处理的方法
1 String getMessage() 返回 Throwable 的简短描述
2 String toString() 返回 Throwable 的详细消息字符串
3 void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的
2.5.4 finally代码块格式
try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,在异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){
}finally{
无论是否出现异常都会执行
}
注意:
1 finally不能单独使用,必须和try一起使用
2 finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都需要资源释放(IO)
3 如果finally有return语句,永远返回finally中的结果,避免该情况。
注意:
1 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
2 父类异常时什么样,子类异常就什么样
2.6 异常的分类
Throwable 类是所有异常和错误的超类,下面有 Error 和 Exception 两个子类分别表示错误和异常。其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。
Error 定义了在通常环境下不希望被程序捕获的异常。Error 类型的异常用于 Java 运行时由系统显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例。
本章不讨论关于 Error 类型的异常处理,因为它们通常是灾难性的致命错误,不是程序可以控制的。本章接下来的内容将讨论 Exception 类型的异常处理。
运行时异常都是RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。表 1 列出了一些常见的异常类型及它们的作用。
throwable类与其此类的结构体系图:
Throwable类中常用方法如下:
1. 返回异常发生时的详细信息
public string getMessage();
2. 返回异常发生时的简要描述
public string toString();
3. 返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
public string getLocalizedMessage();
4. 在控制台上打印Throwable对象封装的异常信息
public void printStackTrace();
2.7 Exception
2..7.1 常见的异常介绍
1. RuntimeException子类:
2.IOException
3. 其他
2.8 自定义异常
一个类继承Exception或是其子类,如果定义的类继承了RuntimeException或是RuntimeException的子类,则此异常为运行时异常;如果此类和RuntimeException 没有任何继承关系,则异常类为非运行时异常
提供两个构造方法
a. 无参数的构造方法
b. 有参数的构造方法,参数类型为String ,接收异常信息利用super(message); 设置异常信息
3 问题总结
1 为什么要创建自己的异常?
答:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。
2 应该在声明方法抛出异常还是在方法中捕获异常?
答:捕捉并处理知道如何处理的异常,而抛出不知道如何处理的异常。
3 java 中 Error 和 Exception 有什么区别?
4 java 中什么是异常链?
5 java 中被检查的异常和不受检查的异常有什么区别?
6 java 异常有哪几种,特点是什么?
7 如果执行 finally 代码块之前方法返回了结果或者
JVM 退出了,这时 finally 块中的代码还会执行吗?
8 关于 java 中的异常处理你有啥心得或者经验?
9 java 中什么时候使用断言(assert)
预告下一篇如何优雅地处理异常,想了解的朋友可以关注 ,文章有帮助的话可以长按点赞有惊喜!!!文章比较长,大家可以先 收藏、转发后看,有什么补充可以在下面评论,谢谢大家!