本文主要是介绍第七章 异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、目标
了解异常概念
理解java异常处理机制
会捕捉异常
会抛出异常
了解java异常体系结构
2、异常
2.1 什么是异常
异常是指在程序运行过程中所发生的不正常的事件,他会中断正在运行的程序
2.2 什么是异常处理
java编程语言使用异常处理机制为程序提供了错误处理的能力
2.3 java 中如何进行异常处理
5个关键字:
try catch finally throw throws
2.3.1 try-catch
使用太容易-catch块捕获异常 分为三种情况
第一种情况,try下面的语句不会出现异常,则会跳过catch中的语句
第二种情况,出现异常
try语句运行中出现异常,则会跳出try语句转而匹配运行catch中的语句
printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程
第三种情况:异常类型不匹配
当try中语句出现异常,而下面的catch异常类型也匹配不到的时候,这时候程序就会中断运行。
在try-catch块中处理异常
加入用户自定义处理信息
System.err.println("出现错误:被除数和除数必须是整数 ");
调用方法输出异常
e.printStackTrace();
异常对象常用的方法
方法 | 说明 |
void printStackTrace() | 输出异常的堆栈信息 |
String getMessage() | 返回异常信息描述字符串, 是printStackTrace()输出信息的一部分 |
2.3.2 常见的异常类型
异常类型 | 说明 |
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
2.4 try-catch-finally
在try-catch块后加入finally块
无论是否发生异常都执行finally块
不执行的唯一情况:
除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总是会被执行的。
存在return的太容易-catch-finally块
2.5 多重catch块
引发多种类型的异常
排列catch语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句
try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一面试题:try-catch块中存在return语句,是否还执行finally块? 如果执行,说出执行顺序try-catch- finally块中, finally块唯一不执行的情况是什么?
2.6 声明异常
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式一、 调用者处理异常
方式二、 调用者继续声明异常
main()方法声明的异常由java虚拟机处理
2.7 抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
使用throw抛出异常
throw与throws
throw | throws |
生成并抛出异常 | 声明方法内抛出了异常 |
位于方法体内部,可作为单独语句使用 | 必须跟在方法参数列表后面,不能单独使用 |
抛出一个异常对象,且只能是一个 | 声明抛出异常类型,可以跟多个异常 |
2.8 异常的体系结构
2.9 自定义异常
当jdk中的异常类型不能满足程序的需要时,可以自定义异常类
使用自定义异常的步骤
2.10 异常链
A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
抛出原有的异常
A方法与B方法进行了关联,不便于代码的修改和扩展
抛出新的异常
异常链创建了新的异常但却保留了原有异常的信息
异常处理原则
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
异常分为Checked异常和运行时异常
Checked异常必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
try-catch-finally中存在return语句的执行顺序
finally块中语句不执行的情况
throw和throws关键字的区别
练习
练习一
按照控制台提示输入1~3之间任一个数字,程序将输出相应的课程名称根据键盘输入进行判断。如果输入正确,输出对应课程名称。如果输入错误,给出错误提示不管输入是否正确,均输出“欢迎提出建议!”语句
Test
package exercise01;import java.net.SecureCacheResponse;
import java.util.Scanner;public class test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入课程代号: (1~3)");try{int i = sc.nextInt();if(i>=1&&i<=3){System.out.println("123");}else {System.out.println("输入错误,请输入1~3内的数字");}}catch (ClassCastException exception){System.out.println("输入错误,请输入1~3内的数字");}finally {System.out.println("欢迎给出建议");}}
}
练习二、
需求说明在setAge(int age) 中对年龄进行判断,如果年龄介于1到100直接赋值,否则抛出异常在测试类中创建对象并调用setAge(int age)方法,使用try-catch捕获并处理异常
People
package exercise02;import com.sun.xml.internal.ws.addressing.WsaActionUtil;import java.time.temporal.Temporal;public class People {private int age;public People(int age) {this.age = age;}public int getAge() {return age;}public void setAge(int age) throws Exception {if (age >=1 && age <=100){this.age = age;}else {throw new Exception("年龄必须在{1-100}之间");}}
}
Test
package exercise02;public class Test {public static void main(String[] args) {People p = new People(12);try{p.setAge(140);}catch (Exception e){e.printStackTrace();}}
}
这篇关于第七章 异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!