3.5 异常

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1.概述

异常是一些用来封装错误信息的对象
它由异常的类型、提示信息、报错的行号提示三部分组成

2.异常的继承结构

请添加图片描述

3.异常的处理方式

当程序中遇到了异常,通常有两种处理方式:捕获或者向上抛出
当一个方法抛出异常,调用位置可以不做处理继续向上抛出,也可以捕获处理异常
大家可以结合生活中的例子:如果工作中遇到了问题,我们可以选择自己处理(捕获),或者交给上级处理(抛出)
捕获方式
请添加图片描述
抛出方式
对于不想现在处理或者处理不了的异常可以选择向上抛出
方式在方法上设置异常的抛出管道即
在可能会会发生异常的方法上添加代码
throws 异常类型
例如void method1 throws Exception1,Exception2,Exception3{ }
TIPS:方法上有默认的异常管道RuntimeException

4.练习异常测试

package cn.tedu.oop;

package partTwo;
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.catch 和 throws

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

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

6.程序错误的类型

程序错误分为三种
编译错误(checked异常)
运行时错误unchecked异常
逻辑错误

  1. 编译错误是因为程序没有遵循语法规则编译程序能够自己发现并且提示我们错误的原因和位置这个也是大家在刚接触编程语言最常遇到的问题。
  2. 运行时错误是因为程序在执行时运行环境发现了不能执行的操作。
  3. 逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误而异常处理就是对这些错误进行处理和控制。

其实我们还可以手动针对逻辑错误执行异常的抛出动作大家可以理解成方法return,只不过此处我们返回的是异常格式
if(逻辑错误有异常){undefined
AException e = new AException(“提示消息”);
throw e;
}

package cn.tedu;

package partTwo;

import java.util.Scanner;

public class TestThrow {
    public static void main(String[] args) {
        method4();
    }

    public static void method4(){
        //1.复写刚刚可能会发生异常的代码
        System.out.println("请输入您要计算的第一个数据:");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请输入您要计算的第二个数据:");
        int b = new Scanner(System.in).nextInt();
        try{
            double result = divide(a,b);
            System.out.println(result);
            //System.out.println(a/b);
        }catch (ArithmeticException e){
            System.out.println("不能除0是我们的错请鞭笞我们吧");
        }
    }

    private static double divide(int a,int b) {
        if(b == 0){
            ArithmeticException e = new ArithmeticException("/ by zero");
            throw e;//类似于return e;
        }
        return a/b;
    }

}

7.throws 与 throw 的区别

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
返回列表

上一篇:ORB

下一篇:YOLO的学习