Java之异常(中):异常处理

一、背景引入:

  一般的情况下:当程序在运行的过程中发生了异常时,系统会捕获抛出的异常对象并输出相应的信息,同时中止程序的运行。这种情况并不是用户所期望的,因此需要让程序接收和处理异常对象,从而避免影响其他代码的执行。当一个异常类的对象被捕获或接收后,程序就会发生流程跳转,系统中止当前的流程而跳到专门的的异常处理语句块,或者直接跳出当前程序和Java虚拟机回到操作系统。

  在Java中,通过try、catch、finally、throw、throws 这5个关键字进行异常对象的处理。

处理异常的5个关键字
关键字 大致的功能描述
try 其里面放置可能引发异常的代码块。(捕获异常)
catch

后面对应异常类型和一个代码块,该代码块内用于处理这种类型的异常()

注意:catch 代码块可以有多个,但要从子类异常到父类异常的顺序编写(后面解释)。

finally 主要用于回收在try代码块里打开的物理资源。(如数据库连接、网络连接和磁盘文件。)因为异常的机制:保证finally代码块总是被执行。
throw 用于抛出一个实际的异常。它可以单独作为一个语句来抛出一个具体的异常对象。
throws 用在方法的异常列表。用于声明该方法可能抛出的异常。

 二、案例分析:

(1)首先创建一个Test_Exception类,里面写的代码是:正常的除法运算与输出

package com.fs.ex;
import java.util.Scanner;
public class Test_Exception {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入被除数:");
        int num1=sc.nextInt();
        System.out.println("请输入除数:");
        int num2=sc.nextInt();
        System.out.print("计算结果为:"+num1+"/"+num2+"="+(num1/num2));
    }
}

(2)进行正常输入测试,代码输出结果:

Java之异常(中):异常处理_第1张图片

(3)除了正常的输入情况,无非可能产生异常的语句是以下三个地方:

int num1=sc.nextInt()或int num2=sc.nextInt()或
System.out.print("计算结果为:"+num1+"/"+num2+"="+(num1/num2));

那么我们把可能发生异常的代码放进try语句里(因为try的作用就是捕获异常),所以一旦发生异常,try就会进行捕获。那为啥要捕获,无非就是想去处理它,那就要用到catch关键字,去处理异常。代码如下:

package com.fs.ex;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test_Exception {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //之所以把这些变量定义在外部:是因为在try代码块中定义只能用在里面,它是局部的。
        // 我在外面用输出不能使用,所以要定义成全局的变量
        int value=0;//用来存储最后运算的结果并输出
        int num1=0;
        int num2=0;//定义两个输入变量并初始化
        try {
            System.out.println("请输入被除数:");
             num1=sc.nextInt();
            System.out.println("请输入除数:");
             num2=sc.nextInt();
             value=num1/num2;
        }catch (InputMismatchException e){  //首先考虑到的是输入不匹配异常
           System.out.println("输入类型错误!");  //当捕获到是这种异常,就对应处理并输出异常信息
        }catch (ArithmeticException e){  //再加一个catch,考虑除数不能为0情况,也就是算术异常
            System.out.println("除数不能为0!");
        }catch(Exception e){
            System.out.println("其他异常情况");
        }
        //处理完之后程序接着往下运行。
        //这样就能够实现,我们既处理了问题,又接下来程序得到执行
        System.out.print("计算结果为:"+num1+"/"+num2+"="+value);

    }
}

这样做的意义就跟生活中的一样:好比你天天上班,但突然一天路上出现了交通事故,这肯定就是由交警去处理,但是最后你还是回去公司照常上班,到了第二天可能又会出现不同的事情,但是你还是最后会去公司上班。也就像捕获异常并处理完毕,程序还是会继续走完结束,跟异常捕获处理的意思是差不多的。 

(4)测试:

正常输入测试,结果一:

Java之异常(中):异常处理_第2张图片

其他异常测试,结果二:Java之异常(中):异常处理_第3张图片 

其他异常测试,结果三:

Java之异常(中):异常处理_第4张图片

当然还有其他测试结果,但是我在最后写了一个:(是为了防止遇到除了前面两种异常,可能还会出现其他未知的异常。这是因为Exception是所有异常类的父类,所以当然里面包含可能出现的其他未知的异常情况,都会统一被它处理)

catch(Exception e){
            System.out.println("其他异常情况");
        }

(4) 注意:catch 代码块可以有多个,但是写的时候顺序是:从子类异常写到父类异常顺序编写。且catch代码块必须位于try代码块之后。

如果我这样改一下:(就会出现异常)Java之异常(中):异常处理_第5张图片

解释: 例如当我发生算术异常时,是不是要从上往下去寻找对应的异常类型,当我找到Exception就已经找到了,虽然它不是只代表算术异常,但它包含了它(因为它是所有异常类的父类)是不是就不会向下去找那个确定的算术异常类型了,则后面的catch代码块没有机会执行了,就会报错。

(5)finally关键字。我在代码继续加入这么几行:

finally {
            //通常用来释放一些内存资源
            System.out.println("无论是否有异常,都必定执行的语句");
        }

当我发生输入异常或者正常输入的代码运行结果如下:

Java之异常(中):异常处理_第6张图片

 Java之异常(中):异常处理_第7张图片

所以finally代码块它是无论是否有异常,都必定执行的语句。

注意:finally代码块通常用来释放一些内存资源(在后面的IO流里会用到),之前我们讲到内存里对象没有更多的指向会被垃圾回收器回收。

四、

(1)throw(后期补上)

(2)throws(后期补上)

你可能感兴趣的:(java,开发语言)