目录
一、什么是异常?
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
程序运行 ———>异常——->程序中断运行
二、什么是异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
程序中预先设置好对付异常的处理办法——–>程序运行——->异常——->对异常进行处理——–> 处理完毕,程序继续运行
三、Java中如何进行异常处理
Java中的异常处理是通过5个关键字来实现的:
try、catah、finally、throw、throws
try:执行可能产生异常的代码
catch:捕获异常
finally: 无论是否发生异常,代码总能执行
throws:声明方法可能要抛出的各种异常
throw:手动抛出异常
1、try —-catah块捕获异常,分为三种情况
第一种情况 :try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略
方法:
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
实例:
public class Math {
static Scanner sc = new Scanner(System.in);
public void show(){
System.out.print("请输入被除数:");
int num1 = sc.nextInt();
System.out.print("请输入除数:");
int num2 = sc.nextInt();
try {
System.out.println("结果是:" + num1 +"/"+ num2 + "=" + num1 / num2);
}catch (Exception exception){
System.err.println("程序出错!除数不能为0");
exception.printStackTrace();
}
}
第二种情况 :try语句块在执行中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
第三种情况 :try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常类型不匹配,程序会中断。
public void method(){
try {
// 代码段 1
// 产生异常的代码段2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
在catch块中处理异常可以加入用户自定义处理信息
异常对象常用的方法处理信息
方法名 | 说明 |
void printStackTrace() |
输出异常的堆栈信息 |
String getMessage() |
返回异常信息描述字符串, 是printStackTrace()输出信息的一部分 |
常见的异常类型
异常类型 | 说明 |
Exception |
异常层次结构的父类 |
ArithmeticException |
算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException |
数组下标越界 |
NullPointerException |
尝试访问 null 对象成员 |
ClassNotFoundException |
不能加载所需的类 |
IllegalArgumentException |
方法接收到非法参数 |
ClassCastException |
对象强制类型转换出错 |
NumberFormatException |
数字格式转换异常,如把“abc“转换成数字 |
2、多重catch块
一段代码可能会引发多种类型的异常,在上面计算并输出商的示例中,其实至少存在两种异常情况,输入非整数内容和除数为0,而我们统一按照Exception类型捕获。如果要分别捕获,就可以使用多重catch块。
引发多种类型的异常
1、排列catch 语句的顺序:先子类后父类
2、发生异常时按顺序逐个匹配
3、只执行第一个与异常类型匹配的catch语句
方法:
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
实例:
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
try {
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println("准备执行除法运算...");
System.out.println(String.format("%d / %d = %d", num1, num2, num1 / num2));
System.out.println("除法运算完毕,已产生结果...");
/*return;*/
System.exit(1);
}catch (NumberFormatException exception){
exception.printStackTrace();
System.err.println("程序异常!异常原因:输入的不是数字!");
}catch (ArithmeticException exception){
exception.printStackTrace();
System.err.println("程序异常!异常原因:除数为0!");
}catch (Exception exception){
System.err.println("程序异常!");
exception.printStackTrace();
}finally {
System.out.println("..........");
}
System.out.println("感谢使用本程序!");
3、finally块
是否发生异常都会执行
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
4、声明异常—–throws
Java语言中通过关键字throws声明某个方法可能抛出的各种异常。
throws可以同时声明多个异常,多个异常用逗号隔开。
如果把计算并输出商的任务封装在divide()方法中,并在方法的参数列表后通过throws声明了异常,然后在main()方法中调用该方法,此时main()方法就知道divide()方法中抛出了异常,可以采取以下两种方式进行处理。
方式1:调用者通过try-catch捕获并处理异常。
方式2:调用者通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常。
main()方法声明的异常将由Java虚拟机来处理。
public class Test7 {
public static void divide() throws Exception {
//可能出现异常的代码
}
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
e.printStackTrace();
}
}
// public static void main(String[] args) throws Exception {
// divide();
// }
}
5、抛出异常———throw
Java语言中通过关键字throw来自行抛出异常。
public class Person {
private String name = ""; // 姓名
private int age = 0; // 年龄
private String sex = "男"; // 性别
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
throw new Exception(“性别必须是\"男\"或者\"女\"!");
}
}
}
四、Error与Exception的区别
都是继承于Throwable这个类
Error是java程序在编译阶段出现的问题,代码将无法通过编译
Exception是Java程序在运行阶段时才出现的问题,能通过编译,但是不能完整运行
五、自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。
使用自定义异常的步骤
•1.定义异常类:继承Throwable类、继承Excepion 或者RuntimeException
•2.编写构造方法,继承父类的实现
•3.实例化自定义异常对象
•4.使用throw抛出
异常处理原则
1、异常处理与性能
2、异常只能用于非正常情况
3、不要将过于庞大的代码块放在try中
4、在catch中指定具体的异常类型
5、需要对捕获的异常做处理
面试题:
1、try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?
答:执行,先执行finally块,后执行return语句
try-catch- finally块中, finally块唯一不执行的情况是什么?
除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总是会被执行的
2、请说出throw和throws的区别?
throw和throws的区别表现在以下三个方面
作用不同: throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。
使用的位置不同:throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。
内容不同: throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97215.html