Java程序异常处理学习

异常

就是代表程序出现的问题

   Integer.valueOf("zbc"); // 运行时异常

        int arr[] = {11,22,33};
       System.out.println(arr[4]); // 索引越界异常

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
  //      try { // 试图监视 程序是否出现异常  ctrl+alt+T 选try/catch
            Date d = sdf.parse("2023-11-28 20:59");  // parse 会报错,告诉我们程序要好好检查,
        //                                                  可能会出错 写代码时就会报错,叫受检查异常
   //     } catch (ParseException e) {  一旦程序真的出现异常,就捕获异常,交给解析异常变量 e
     //       e.printStackTrace(); 再通过e调异常的方法,为我们打印出异常信息
       // }     //   throws ParseException 把程序可能出现 的异常抛出去,给上一层处理 main方法不是最上层,JVM虚拟机掉的main方法
        // JVM并不会处理你的问题,也会在内部调try/catch来打印你的问题

作用:
  1. 异常是用来查询系统Bug的关键参考信息

  2. 异常可以作为方法内部的一种特殊返回值,以便通知上层调用者底层的执行情况!

    // 代码图
    

    在这里插入图片描述

体系

java.lang.Throwable:

Error

​ Exception:

RuntimeException

, 其他异常

3和4差距在于写代码层面,3,不会影响我们

抛出异常(throws)

在方上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理

方法 throws 异常1,异常2,异常3,…{}

捕获异常(try…catch)

直接捕获程序出现的异常

try{
// 监视可能出现异常的代码
}catch(异常类型1 变量){
 // 处理异常
}catch(异常类型2 变量){
// 处理异常
}...

自定义异常

概述:java能力有限,无法为全部问题提供异常类来代表,如果企业自己的某个问题,想通过异常来表示,以便用异常来管理问题,就需要自己定义异常类。

自定义运行时异常:
  • 定义一个异常类继承RuntimeException你要表示什么问题,就取名什么问题

  • 重写构造器 // 1,必须让这个类继承自RuntimeException,才能成为一个运行时异常类

    public class AgeIllegalRuntimeException extends RuntimeException{
        public AgeIllegalRuntimeException() {
        }
    
        public AgeIllegalRuntimeException(String message) {
            super(message);
        }
    }
    
  • 通过throw

    new 异常类(xxx)来创建异常对象并抛出。编译阶段不报错,提醒不强烈,运行时才可能出现!!

     public static void main(String[] args) {
            // 需求:保存一个合法的年龄
            try {
                saveAge(160);
                System.out.println("底层正常执行。");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("底层出了bug!");
            }
        }
        public static void saveAge(int age){
                if (age > 0 && age < 150){
                    System.out.println("年龄已成功保存:"+ age);
                }else{
                    // 用一个异常类封装该问题
                   throw new AgeIllegalRuntimeException("/age is illegal, your age is " + age);
                }
        }
    }
    
自定义编译时异常: 与运行时异常只有继承和报错的区别。
  • 定义一个异常类继承Exception
  • 重写构造器
  • 通过throw new 异常类来创建并将异常对象抛出,编译阶段就报错,提醒更强烈!
建议

程序员易犯的错误就用编译时异常,反之用运行时异常

开发中对于异常的常见处理方法

1,异常层层上抛,到最外层的调用,捕获异常,记录异常并响应合适的信息给用户,便于用户更改打补丁,处理,

 public static void main(String[] args) {
        try {
            test1();
        } catch (Exception e) {
            System.out.println("您当前的操作有问题!");
            e.printStackTrace(); // 打印异常对象的信息。记录一下
        }
    }
    public static void test1() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        Date d = sdf.parse("2023-11-28 20-59-7");
        System.out.println(d);
        test2();
    }
    public static void test2() throws Exception {
        // 获取文件的
        InputStream is = new FileInputStream("E:/meinv.png");  // 不建议抛具体的异常,在开发中你也不知道有什么异常
    }

2,捕获异常,尝试重新修复,重新跑一下,看能不能重新启动

 public static void main(String[] args) {
        // 要用户输入一个合适合法的价格,知道输入的合法为止
        // 尝试修复
        while (true) {
            try {
                System.out.println(getMoney());
                break;
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("请输入合法的数!");
            }
        }
    }
    public static double getMoney(){
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入合适的价格:");
            double money = sc.nextDouble();
            if (money >= 0){
                return money;
            }else{
                System.out.println("您输入的价格不合适!");
            }
        }
    }

你可能感兴趣的:(java,学习)