JavaSE(十)异常

Java特点:

跨平台:一次编译 随处运行(因为有JVM机制);

安全:内存 (内存自动申请 内存自动释放 GC机制 垃圾回收机制 )

简洁性,简单

健壮性,异常机制;

错误 Error,源码的问题 机器配置的问题,错误是代码解决不了 要么改动源码 要么改动机器配置;

堆内存溢出错误 栈内存溢出错误

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.edu.www.day0424.Test.main(Test.java:7)
Exception in thread "main" java.lang.StackOverflowError

异常 Exception

异常

  • Exception 异常 不正常的事件

  • Error错误是所有错误类型的父类型; Exception类型是所有异常类型的父类型;

  • Error 和Exception的父类型 是 Throwable

  • Exception 的子类型

    • 一类是运行时异常父类型是RuntimeException都是运行时异常;

    • 一类编译时异常只要不是RuntimeException子类型;

  • 运行时异常 可以不处理 编译也能通过 非受检异常 ;

  • 编译时异常 必须处理 编译才能通过 受检异常;

1,异常的分类

/**
     *2个子类型 编译器对其态度完全不同
     */
    private static void method4() {
        Error e;
        StackOverflowError stackOverflowError;
        Exception exception;
        RuntimeException runtimeException;
        ArithmeticException arithmeticException;
        // 运行时异常 可以不处理 编译也能通过 非受检异常 ;
        System.out.println(1 / 0);
        System.out.println("hello");
        //编译时异常
        FileNotFoundException f;
        //编译器    编译时异常 必须处理 编译才能通过 受检异常;
        try {
            FileInputStream inputStream = new FileInputStream("");
        } catch (FileNotFoundException e2) {
​
        }
    }

2,常见的异常类型

 /**
     * 常见异常类型
     */
    private static void method5() {
        int[] arr = new int[3];
        //数组索引越界
        ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException;
        System.out.println(arr[1]);
        String str = "null";
        //空指针异常
        NullPointerException nullPointerException;
        System.out.println(str.equals("y"));
        //算术异常
        ArithmeticException arithmeticException;
        System.out.println(1 / 2);
        System.out.println("hello");
        Scanner sc = new Scanner(System.in);
        InputMismatchException input;
        int i = sc.nextInt();
    }

1.1.异常的处理

1.1.1. 抓异常

  • 负责任

1,try

  • try块中放 有可能出现异常的代码,try中一旦产生异常 直接跳出try块

  • 有异常出现 就是有一个异常对象产生了

 private static void method6() {
        try {
            //try块中放 有可能出现异常的代码,try中一旦产生异常 直接跳出try块
            //有异常出现 就是有一个异常对象产生了
            System.out.println(1 / 0);
            System.out.println("14line===============");
            //只有当类型匹配(也可以是父类型)的时候 才会进入catch块  一旦进入catch表示抓住了
        } catch (ArithmeticException e) {
            //向上转型
            //Exception e2 = new ArithmeticException();
            //异常的处理代码
            System.out.println(e);
            //获取异常信息
            System.out.println(e.getMessage());
            //打印堆栈报错信息 追踪记录
            // e.printStackTrace();
        }
        System.out.println("hello");
    }

2,catch

  • 只有当类型匹配(也可以是父类型)的时候 才会进入catch块 一旦进入catch表示抓住了

多重catch

  • 小类型在上 大类型在下面;异常对象一旦被抓捕之后 不会在继续向下匹配了;只能被抓捕一次

 /**
     * 多重catch 小类型在上 大类型在下面
     * 异常对象一旦被抓捕之后 不会在继续向下匹配了;只能被抓捕一次
     *
     * @param str
     */
    public static void method7(String[] str) {
        int i = 0;
        try {
            i = Integer.parseInt(str[0]);
        } catch (NullPointerException e) {
            System.out.println("空指针异常产生了 抓捕到了");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组索引越界异常产生了 抓捕到了");
        } catch (NumberFormatException e) {
            System.out.println("格式化转换异常产生了 抓捕到了");
        } catch (Exception e) {
            System.out.println(" 兜底 ");
        }
        System.out.println(i);
        System.out.println("method7 end");
    }

3, finally

/**
     * finally
     */
    private static void method9() {
        try {
            System.out.println(1 / 2);
            System.out.println("14line===============");
            //return一旦执行 表示方法结束;
            return;
        } catch (NullPointerException e) {
            System.out.println("异常抓捕到了");
        } finally {
            //最终会执行的代码  一定会执行的代码(不管有没有异常;也不管异常有没有被处理)
            // 有关资源的释放 的代码 ;
            System.out.println("一定会执行的代码");
        }
        System.out.println("hello");
    }

1.1.2.抛异常

  • 有异常对象 抛给上层调用者

1,运行时异常

  • 运行时异常 JVM自动创建的,而且自动抛出来 如果没有抓捕 会自动抛给上层调用者(谁调用你 就是你的上层);

public class ExceptionExer2 {
    public static void main(String[] args) {
//       FileInputStream fileInputStream = new FileInputStream("");
    }
​
    private static void method3() {
        try {
            method2(10, 0);
        } catch (ArithmeticException e) {
            System.out.println("main 解决了");
        }
        System.out.println("main 执行完毕");
    }
​
    public static void method2(int op1, int op2) {
        method1(op1, op2);
        System.out.println("method2 执行完了");
    }
​
    /**
     * 运行时异常 JVM自动创建的,而且自动抛出来 如果没有抓捕 会自动抛给上层调用者(谁调用你 就是你的上层);
     *
     * @param op1
     * @param op2
     */
    public static void method1(int op1, int op2) {
        int re = op1 / op2;
        System.out.println("re: " + re);
        System.out.println("method1 执行完了");
    }
}

2,编译时异常

public class ExceptionExer3 {
    public static void main(String[] args) {
        method2();
        System.out.println("main end");
    }

    public static void method2() {
        try {
            method1("a.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("method2执行完毕");
    }

    /**
     * throw 出现在方法体中 ,throw 异常对象; throw一旦执行 也表示方法的结束 下面的代码不再执行
     * throws 出现方法声明处 表示此方法会抛出 的异常类型;throws后面都是编译时异常类型 如果有多个 逗号隔开
     *
     * @param fileName
     * @throws FileNotFoundException
     */
    public static void method1(String fileName) throws FileNotFoundException, IOException {
        //
        if (fileName.equals("a.txt")) {
            FileNotFoundException fileNotFoundException = new FileNotFoundException();
            RuntimeException runtimeException = new RuntimeException();
            // throw 异常对象;
            throw fileNotFoundException;
//            System.out.println("hello");
        }

        if (fileName.length() <= 0) {
            throw new IOException();
        }
        System.out.println("method1 正常结束");
    }
}

1.2.自定义异常

  • 只 需要定义的类型 继承 异常体系中任何一个类型

public class AgeInvalidException extends RuntimeException {
    public AgeInvalidException() {
    }

    public AgeInvalidException(String message) {
        super(message);
    }
}

使用

public class ExceptionExer4 {
    public static void main(String[] args) {
        method2(152);
        System.out.println("main end");
    }


    public static void method2(int age) {
        if (age <= 0 || age > 150) {
            throw new AgeInvalidException("年龄不合法");
        }
        System.out.println("method1 end");
    }


    /*public static void method1(int age) throws AgeInvalidException {
        if (age <= 0 || age > 150) {
            throw new AgeInvalidException("年龄不合法");
        }
        System.out.println("method1 end");
    }*/
}

1.3.开发规范

  • 对于运行时异常 一般做的是参数的有效性校验,提前排查出来异常

public static void main(String[] args) {
        Student stu1 = null;
        method3(stu1);
    }

    /**
     * 非空校验
     * @param arr
     * @throws Exception
     */
    public static void method4(int[] arr) throws Exception {
        if (arr == null) {
            throw new NullPointerException("");
        }
        if (arr.length == 0) {
            throw new Exception("");
        }
    }

    public static void method3(Student student) {
        //校验参数
        if (student == null) {
            throw new NullPointerException(" ");
        }
        int id = student.getId();
        String name = student.getName();
    }

    public static void method2(int op1, int op2) {
        if (op2 != 0) {
            int re = op1 / op2;
        }
    }

    public static void method1(String str) {
        //1 有效性校验
        if (str != null) {
            if (str.equals("y")) {
            }
            System.out.println("");
        } else {
            throw new NullPointerException("str 为null");
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值