异常处理
什么是异常:是指在程序运行过程中所发生的不正常事件,他会中断正在运行的程序。
异常处理
- 概念:java编程语言使用异常处理机制为程序提供了错误处理能力
- 过程:程序中预先设置好对付异常的处理办法–程序运行–出现异常–对异常进行处理–处理完毕,程序继续运行
- 手段:java的异常处理是通过5个关键字来实现的try、catch、finally、throw、throws
1.5个关键字的作用
-
try 执行可能产生异常的代码
-
catch捕获异常
-
finnally无论是否发生异常,代码总能执行
-
throws 声明方法可能要抛出的各种异常
-
throw手动抛出异常
2.try-catch语句的3种情况
-
try块中的所有语句正常执行完毕,不会发生异常,那么所有try-catch语句都将被忽略
public void method(){ try{ //代码段(此处不产生异常) }catch(Exception ex){ //对异常进行处理的代码段 } //代码段 }
-
try语句块执行过程中遇到异常,那么在try块中的其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,那相应的catch块将会被执行,然后执行try-catch后面的代码段.
public void method(){ try{ //代码段1 //产生异常的代码段2 //代码段3 }catch(Exception ex){ //对异常进行处理的代码段 } //代码段4 } //执行代码段1--代码段2时进行捕获异常进入catch--执行代码4(不在执行代码段3)
-
第三种情况:try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常不匹配,程序会中断
3.在catch块中处理异常
-
加入用户自定义处理信息
System.err.println(“出现错误:被除数和除数必须是整数,”)
-
异常对象的常用处理方法
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,是printStrackTrace()输出信息的一部分
4.常见的异常类型
Exception 异常层次结构的父类
ArithmeticException 算数错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException null指针异常
ClassNotFoundException 不能加载所需的类
IllegalArgumentException 对象强制类型转换出错
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常
5.多重catch块
一段代码可能会引发多种类型的异常,处理的两种方式:1.execption 2.多重catch块进行分别捕获
注意事项
- 排列catch语句的顺序:先子类后父类
- 发生异常时按顺序逐个匹配
- 只执行第一个与异常类型匹配的catch语句
执行顺序:出现异常–从上至下匹配catch块–找到进入–执行try-catch块后的代码段
问题1:try-catch块中存在return语句,是否还执行finally块,如果执行
,说出执行顺序?
执行,try发生异常–产生异常对象–异常类型匹配–进入catch块–执行finally块–进入catch块
try-catch-finally块中,finally块中唯一不执行的情况是什么?
在try-catch块后加入finally块,是否发生执行异常都执行,唯情况为catch块中加入system.exit(1),强制退出虚拟机.
6.声明异常–throws
关键字throws声明某个方法可能抛出各种异常,throws可以同时声明多个异常,多个异常用逗号隔开
异常的处理方式
- 调用者通过try-catch捕获并处理异常
- 调用者通过throws继续声明异常,如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常
- main()方法声明的异常将由java虚拟机来处理
7.throw抛出异常
除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常范围内、性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。
public class Person {
private String name ="";
private String sex ="男";
public void setSex(String sex) throws Exception{
if("男".equals(sex)||"女".equals(sex)){
this.sex=sex;
}else{
throw new Exception("性别必须是男或者女!");
}
}
}
8.throw和throws的区别
- 作用不同:throw用于在程序中抛出异常;throws用于声明在该方法体内抛出了异常
- 使用位置不同:throw位于方法体内部,可以作为单独语句使用,throws必须跟在方法参数列表后面,不能单独使用
- 内容不同:throw抛出一个异常对象,而且只能是一个,throws后面跟异常类,而且可以跟多个异常类
9.异常的分类
Object–Exception类和Error类的父类Throwable–Error、Exception
仅靠程序本身无法恢复的严重错误Error–AWTError ThreadDeath
由java应用程序抛出和处理的非严重错误Exception–RuntimeException、Checked异常,程序必须处理该异常 SQLException、ClassNotFoundException
运行时异常,不要求程序必须做出处理RuntimeException–ArithmeticException、NullPointerException、NumberFormatException
10.自定义异常
步骤:定义异常类–编写构造方法,继承父类的实现–实例化自定义异常对象–使用throw抛出
定义异常类的常用方法:继承Throwable类、继承Exception或者RuntimeException
public class MyException extends Exception {
//无参构造
public MyException(){
}
//有参构造
public MyException(String msg){
super(msg);
}
//抛出异常
public void get(int i)throws MyException{
if(i<0){
throw new MyException("不能小于0");
}
}
public static void main(String[] args) throws MyException {
new MyException().get(-9);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iS80Pqb-1601113614566)(C:\Users\aym\AppData\Roaming\Typora\typora-user-images\1601112455563.png)]
public class Person {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
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岁之间!");
}
}
public Person() {
}
public Person(String name, String sex, int age) throws Exception {
this.name = name;
this.sex = sex;
this.setAge(age);
}
}
测试类
public class Test {
public static void main(String[] args) {
//调用者捕获异常
try {
Person person=new Person("张三","男",0);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
11.异常处理的原则
- 异常处理与性能
- 异常只能用于非正常情况
- 不要将过于庞大的代码块放在try中
- 在catch中指定具体的异常类型
- 需要对捕获的异常处理
小结:重点掌握异常处理的步骤,自定义异常处理的使用方法,通过在日常编写程序过程中去了解异常处理,同时,自定义异常在初学阶段不经常使用,但必须会基本的操作。