目录
一、简介
二、作用
三、JVM默认处理异常方式
四、捕获异常
1.格式
2.目的
3.示例
五、灵魂四问
1.如果try中没有遇到问题,怎么执行?
2.如果try中可能会遇到多个问题,怎么处理?
3.如果try中遇到的问题没有被捕获,怎么执行?
4.如果try中遇到了问题,那么try里面剩余的其他代码还会执行吗?
六、异常的常见方法
七、抛出异常
八、try-finally
1.格式
2.示例
3.finally代码不执行情况
九、Demo
一、简介
编译时异常是提醒程序员检查本地信息
运行时异常是代码出错而导致的程序出现的问题,一般是参数传递错误出现
二、作用
1.用来查询bug的关键参考信息
2.可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
三、JVM默认处理异常方式
把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
程序停止执行,下面的代码不会再执行了
四、捕获异常
1.格式
在可能出现异常的地方使用
2.目的
当代码出现异常时,可以让程序继续往下执行
3.示例
五、灵魂四问
1.如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
注意:只有当出现了异常才会执行catch里面的代码
2.如果try中可能会遇到多个问题,怎么处理?
会写多个catch与之对应
如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面
了解:在JDK7之后,我们可以在catch中同时捕获多个异常,中间用 | 进行隔开
表示如果出现了A异常或者B异常的话,采取同一种处理方案
示例代码
3.如果try中遇到的问题没有被捕获,怎么执行?
相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。即将异常信息打印到控制台,程序停止执行,下面的代码不会再执行了
4.如果try中遇到了问题,那么try里面剩余的其他代码还会执行吗?
下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体
但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理
示例
六、异常的常见方法
示例:
将异常以红色字体输出在控制台(System.err)
七、抛出异常
示例
将异常抛出到方法使用处。抛出处要处理,抛出或捕捉
八、try-finally
finally一般配合try-catch使用,关闭相关的流,用于处理资源回收和清理。
1.格式
try{//发生异常的代码
}catch(异常类型 e){//处理异常
}finally{//关闭相关流或输出信息
}
注意:无论try部分的代码有没有发生异常,finally部分的代码都会执行。
2.示例
public class FinallyTest {static int x = 1;static int y = 10;static int z = 100;public static void main(String[] args) {int value = finallyReturn();System.out.println("value=" + value);System.out.println("x=" + x);System.out.println("y=" + y);System.out.println("z=" + z);}private static int finallyReturn() {try {// 无异常return ++x;} catch (Exception e) {return ++y;} finally {return ++z;}}
}
上面的代码,try方法没有异常不会执行catch代码,执行完try,再执行finally,最后输出
value = 101,x=2,y=10,z=101
如果try出现异常,return ++x不执行,执行catch后执行finally,最后输出
value = 101 ,x=1 ,y=11, z=101
上面的代码示例输出都是“程序结束”,说明无论在try还是catch里面return,finally部分代码还是会执行,并且try-finally后面的代码不会执行
3.finally代码不执行情况
A.没进入try部分代码
B.JVM崩溃:如果Java虚拟机崩溃(例如,由于操作系统故障或内存溢出),则
finally
块不会执行。C.无限循环:如果在
try
块中存在无限循环,且没有跳出循环的条件,那么finally
块将永远不会执行。D.调用
System.exit()
:如果在try
块中调用了System.exit()
方法,程序将立即终止,finally
块不会执行。
九、Demo
public class Test {public static void main(String[] args) {Dog dog = new Dog();Scanner sr = new Scanner(System.in);try {System.out.println("请输入狗的名字");String name = sr.next();dog.setName(name);System.out.println("请输入狗的年龄");int age = sr.nextInt();dog.setAge(age);} catch (InputMismatchException e) {System.out.println("输入的数据格式有误");} catch (RuntimeException e) {e.printStackTrace();}}
}
class Dog {private String name;private int age;public Dog() {}public Dog(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {if (name.length() < 2 || name.length() > 10) {throw new RuntimeException("名字的长度必须在2-10之间");}this.name = name;}public int getAge() {return age;}public void setAge(int age) {if (age < 0 || age > 20) {throw new RuntimeException("年龄必须在0-20之间");}this.age = age;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}
}
十、自定义异常
1.格式
(1)定义异常类 注意:名字要见文知义
(2)写继承关系 继承RuntimeException就是运行时异常 继承Exception就是编译时异常
(3)写无参构造器
(4)写有参构造器
看一个java底层实现好的定义异常,继承RuntimeException是运行时异常,有无参和有参构造器,异常类名也是明白作用。
创建自定义异常的意义:就是为了让控制台的报错信息更加的见名之意 即异常的名字