java之异常

avatar
作者
猴君
阅读量:0

目录

一、简介

二、作用

三、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;     }     @Override     public String toString() {         return "Dog{" +                 "name='" + name + '\'' +                 ", age=" + age +                 '}';     } } 

 十、自定义异常

1.格式

(1)定义异常类   注意:名字要见文知义

(2)写继承关系   继承RuntimeException就是运行时异常    继承Exception就是编译时异常 

(3)写无参构造器

(4)写有参构造器

看一个java底层实现好的定义异常,继承RuntimeException是运行时异常,有无参和有参构造器,异常类名也是明白作用。

创建自定义异常的意义:就是为了让控制台的报错信息更加的见名之意 即异常的名字

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!