目录
4.如果try中遇到了问题,那么try里面剩余的其他代码还会执行吗?
一、简介
编译时异常是提醒程序员检查本地信息
运行时异常是代码出错而导致的程序出现的问题,一般是参数传递错误出现
二、作用
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; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
十、自定义异常
1.格式
(1)定义异常类 注意:名字要见文知义
(2)写继承关系 继承RuntimeException就是运行时异常 继承Exception就是编译时异常
(3)写无参构造器
(4)写有参构造器
看一个java底层实现好的定义异常,继承RuntimeException是运行时异常,有无参和有参构造器,异常类名也是明白作用。
创建自定义异常的意义:就是为了让控制台的报错信息更加的见名之意 即异常的名字