Java的异常处理

异常处理

这里写图片描述

Throwable 异常处理类的顶端类

Error (服务器崩溃 数据库崩溃)
Exception (异常类) : RuntimeException(运行时异常)
        // 角标越界
        int[] num = new int[1];
        System.out.println(num[2]);

        //ArrayIndexOutOfBoundsException
        // 空指针异常
        int[] num = new int[1];
        num = null;
        System.out.println(num[1]);

        // NullPointerException
        // 算数异常
        // ArithmeticException
        System.out.println(10/0);

try….catch….finally

   try 指测试异常代码
   catch 指捕获异常信息
   finally 指异常结束后所执行的


  try...catch捕获异常的流程

  1.函数中 某句代码发生异常
  2.发生异常就产生了对应的异常对象
  3.这个异常对象 返回给调用者
        情况1: 没有对异常进行处理 这时就会把异常交给上级
                交给JVM去处理 JVM使用默认的处理机制
        情况2: 调用者进行异常处理(try...catch)
                这时返回的异常对象 会跟catch进行匹配
                匹配成功执行catch中的语句
// 测试异常
class TestException{
    // 除法 返回两个数的商
    public int fun(int a , int b) {
        // 发生异常一定会产生一个对应的异常对象
        // new ArithmeticException("/ by zero")
        return a / b ;
    }
}
    public static void main(String[] args) {
        TestException testException = new TestException();
        try {
            // 可能发生异常的代码
            int num = testException.fun(10, 0);
            System.out.println(num);
        }catch (Exception e) {
            // 捕获异常
            // 小括号中 要放捕获的异常
            System.out.println("你除的是0");
        }
        System.out.println("!!!");
    }

多catch处理异常

        int[] arr = new int[4];

        try {
            // 报的越界异常 产生了越界异常的对象
            System.out.println(arr[5]);
            arr = null;
            System.out.println(arr[1]);
            System.out.println(10/0);
        }catch (ArrayIndexOutOfBoundsException e) {
            // 再匹配catch时当有被匹配上时其他的catch就不会被匹配了
            System.out.println("你越界了");
        }catch (NullPointerException e) {
            System.out.println("你空指针了");
        }catch (ArithmeticException e) {
            System.out.println("你除0了");
        }catch (Exception e) {
            // 注意!! 如果catch中要写exception去捕获
            //          需放在下面 并且 catch中异常 要从小到大
            System.out.println("???");
        }System.out.println("!!!");

finally

出现异常与否 不会影响到finally的执行
finally: 一般用来关闭资源 关闭流 关闭数据库
class TestFinally{
    // 方法被调用时 返回num是多少?
    public int fun() {
        int num = 10;
        try {
            num = 20;
            System.out.println(9/3);
            return num;
        } catch (Exception e) {
            // 捕获异常
            num = 30;
            // 建立返回路径 相当于有一个箱子
            // 箱子中保存的是返回的值
            // 不会直接return 会看一下 有没有 finally
            // 有finally就执行 但是不会更改 已经在路径中
            // 等finally 执行完了 再完全return
            return num;
        } finally {
            num = 40;
            // finally 中 只写关闭资源 写return没有意义
            // 会把之前的返回值都覆盖掉
            // return num;
        }

    }
}

    try {
            System.out.println(1/1);
            // 即使 return方法 finally也会执行
            // 直接关闭JVM finally就不会执行
            return;
        } catch (Exception e) {
            System.out.println("你除0了");
        } finally {
            System.out.println("????????");
        }
        System.out.println("!!!!!");

运行时异常 和 编译时异常

    FileInputStream i = new FileInputStream("wl.txt");
    try {
            FileInputStream i = new FileInputStream("wl.txt");
        } catch (Exception e) {
            System.out.println("无此文件");
        }
        // 读取该路径下的文件
        // 系统不知道你这路径有没有文件
        // 需要提前询问你一下 如果没有这个路径下的文件
        // 编译时异常 是系统强制你要处理的

     处理方式1: 添加try...catch(手动处理)
        try {
            FileInputStream i = new FileInputStream("wl.txt");
        } catch (Exception e) {
            System.out.println("无此文件");
        }
     处理方式2: 可以把异常抛给上级去处理
        // 可以把问题抛给main函数 在main函数的函数声明上添加
        // throws 要抛出的异常类型名
        public static void main(String[] args) throws FileNotFoundException{
            FileInputStream i = new FileInputStream("wl.txt");
        }

Throwable的方法

    public static void main(String[] args) {
        Exception e = new Exception("这里可以写错误信息");
        // 获取错误信息
        String message = e.getMessage();
        // System.out.println(message);
        // System.out.println(e);
        // 打印错误信息 错误位置 异常类的类名
        e.printStackTrace();
    }


    //  无限输入整数 存放到集合中 打印 输入quit停止
    //  希望在输入字符串的时候 让程序也能继续运行
    public static void main(String[] args) {
        System.out.println("请输入一个整数: ");
        Scanner scanner = new Scanner(System.in);
        ArrayList<Integer> arrayList = new ArrayList<>();
        while (true) {
            String string = scanner.nextLine();
            if (string.equals("quit")) {
                break;
            }
            // 处理异常
            try {
                // 字符串转数字
                int num = Integer.parseInt(string);
                // 添加到数组里
                arrayList.add(num);
            } catch (Exception e) {
                System.out.println("输入的不是整数 请重新输入");
            }
        }
        // 循环结束打印一下
        System.out.println(arrayList);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值