6.18、Java初级异常

1. 异常概述

1.1 什么是生活的异常

男主角小明每天开车上班,正常车程 1 小时。但是,可能会出现意外,出现意外,即为异常情况。我们会做相应的处理。如果不处理,到不了公司。
处理完了,就可以正常开车去公司。
请添加图片描述

1.2 什么是程序的异常

异常 :指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致 JVM 的非
正常停止。
其次还可以用来封装错误信息的对象,它由异常的类型、提示信息、报错的行号提示三部分组成

程序异常( Error 和 Exception)

Throwable 可分为两类:Error 和 Exception。分别对应着 java.lang.Errorjava.lang.Exception 两个类。
Error:Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。

3 异常的处理方式

当程序中遇到了异常,通常有两种处理方式:捕获或者向上抛出
当一个方法抛出异常,调用位置可以不做处理继续向上抛出,也可以捕获处理异常
大家可以结合生活中的例子:如果工作中遇到了问题,我们可以选择自己处理(捕获),或者交给上级处理(抛出)

捕获方式:

在这里插入图片描述

抛出方式:
对于不想现在处理或者处理不了的异常可以选择向上抛出
方式:在方法上设置异常的抛出管道,即:
在可能会会发生异常的方法上添加代码:
throws 异常类型
例如:public void method1 throws Exception1,Exception2,Exception3{ }
注意:方法上有默认的异常管道:RuntimeException

throws(抛出)和 try…catch的使用(捕获)

4 练习:异常测试
创建包: cn.tedu.oop
创建类: ExceptionDemo.java

package cn.tedu.oop;

import java.util.InputMismatchException;
import java.util.Scanner;

/*本类用于异常的入门案例*/
public class ExceptionDemo {
    
    
    //public static void main(String[] args) throws Exception {//问题实际未处理,还报错
    public static void main(String[] args) {
    
    
        //method1();//调用暴露异常的方法
        //method2();//调用解决异常的方法--异常解决方案1--捕获处理--自己解决
        /*main()不直接调用会抛出异常的method3()
        * 而是调用f(),f()解决了method3()可能会抛出的异常*/
        f();
        //method3();//调用解决异常的方法--异常解决方案2--向上抛出--交给调用者来解决
    }
    //相当于在main()调用method3()之前解决了method3()可能会抛出的异常
    private static void f() {
    
    
        try {
    
    
            method3();
        }catch (Exception e){
    
    
            System.out.println("您输入的数据不对~请重新输入!");
        }
    }

    /*如果一个方法抛出了异常,那么谁来调用这个方法,谁就需要处理这个异常
    * 这里的处理也有两种方案:捕获解决 或者 继续向上抛出
    * 但注意:我们一般会在main()调用之前将异常解决掉
    * 而不是将问题抛给main(),因为没人解决了,该报错还报错*/
    /*异常抛出的格式:在方法的小括号与大括号之间,写:throws 异常类型
    * 如果有多个异常,使用逗号分隔即可*/
    //0.定义一个解决异常的方法-方案2
    //private static void method3() throws ArithmeticException,InputMismatchException{
    
    
    private static void method3() throws Exception{
    
    
        //1.复写一下刚刚的代码
        System.out.println("请您输入要计算的第一个整数:");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请您输入要计算的第二个整数:");
        int b = new Scanner(System.in).nextInt();
        System.out.println(a/b);
    }

    /*异常捕获处理的格式:
    * try{
    *    可能会抛出异常的代码
    * }catch(异常的类型 异常的名字){
    *    万一捕获到了异常,进行处理的解决方案
    * }
    * try-catch结构可以嵌套,如果有多种异常类型需要特殊处理的话
    * */
    //0.定义一个解决异常的方法-方案1
    private static void method2() {
    
    
        //1.按照捕获处理的格式完成结构
        try{
    
    
            //2.复写一下刚刚的代码
            System.out.println("请您输入要计算的第一个整数:");
            int a = new Scanner(System.in).nextInt();
            System.out.println("请您输入要计算的第二个整数:");
            int b = new Scanner(System.in).nextInt();
            System.out.println(a/b);
        }catch(ArithmeticException e){
    
    //异常类型 异常名
            System.out.println("除数不能为0!");
        }catch (InputMismatchException e){
    
    
            System.out.println("请输入规定的整数类型!");
        /*使用多态的思想,不论是什么子异常,统一看作父类型Exception
        * 做出更加通用的解决方案,甚至可以只写这一个,上面2个不写了*/
        }catch (Exception e){
    
    
            System.out.println("您输入的数据不对~请重新输入!");
        }
    }

    //0.定义一个用来暴露异常的方法
    private static void method1() {
    
    
        //1.提示并接收用户输入的两个整数
        System.out.println("请您输入要计算的第一个整数:");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请您输入要计算的第二个整数:");
        int b = new Scanner(System.in).nextInt();
        //2.输出两个数除法的结果
        //输入11和0,报错:ArithmeticException--算术异常,除数不能为0,数学规定
        //输入11和3.4,报错:InputMismatchException--输入不匹配异常
        System.out.println(a/b);
        /*1.不要害怕BUG,真正的勇士敢于直面自己写的BUG*/
        /*2.学会看报错的信息提示,确定自己错误的方法*/
        /*3.学会看报错的行号提示,确定自己报错的位置,哪里不对点哪里
        * 注意:源码不会错,要看的是自己写的代码*/
    }
}

5 拓展1 catch 和 throws

异常处理只有两种方式: catch 和 throws,所以必须二选一
由于Java语法本身的特点,需要开发者事先考虑异常如何处理,也就是我们常说的:“未雨绸缪”
对于初级开发者来说,我们可能会捕获,但不处理异常
try {

} catch(Exception e) {
}
底层异常,应该向前抛到前面处理
经验少时,不知道该在什么位置捕获处理,应该选择 throws
但是大家需要注意,在异常抛出时,有些异常比如运行时异常,可能并不会强制要求抛出此异常,调用时也没有报错显示需要额外处理,这个时候就需要大家平时多积累,掌握良好的编码习惯了,手动添加代码进行预处理,增强程序的健壮性了。

6 拓展2 throws 与 throw 的区别

throws
用在方法声明处,其后跟着的是异常类的名字
表示此方法会抛出异常,需要由本方法的调用者来处理这些异常
但是注意:这只是一种可能性,异常不一定会发生

throw
用在方法的内部,其后跟着的是异常对象的名字
表示此处抛出异常,由方法体内的语句处理
注意:执行throw一定抛出了某种异常

猜你喜欢

转载自blog.csdn.net/weixin_58276266/article/details/131251025
今日推荐