day14 异常

day14 异常

1、ArrayIndexOutOfBoundsException

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQp3TtLp-1631584683815)(image\12、异常体系.png)]

2、JVM的默认处理方案

  • 把异常的名称,异常原因以及出现的位置等信息输出在了控制台
  • 出现停止执行

3、异常处理

如果程序出现了问题,我们需要自己来处理,有两种方案:

  1. try-----catch
    try{
        可能出现异常的代码
    }catch(异常类名 变量名){
        异常处理代码
    }
    

    执行流程:

    1、程序从try里面的代码开始执行

    2、出现异常,会自动生成一个异常类对象,该异常对象将被提交给java运行时系统

    3、当java运行时系统接收到异常对象时,会到cath中去找匹配的异常类,找到运行异常的处理执行完毕之后,出现还可以继续往下执行

    package com.zcl.ExceptionDemo01;
    
    public class ExceptionDemo {
        public static void main(String[] args) {
            System.out.println("开始");
            method();
            System.out.println("结束");
        }
        public static void method(){
            // try---catch 异常处理
            try{
                int[] arr = {1,2,3};
                System.out.println(arr[3]);
            }catch (ArrayIndexOutOfBoundsException e){ // new
                // System.out.println("您访问的数组索引不存在");
                e.printStackTrace(); // 调用方法输出异常信息
            }
            /* 异常处理输出
            开始
            您访问的数组索引不存在
            结束
             */
        }
    }
    /** 异常报告
     * 开始
     * Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
     * 	at com.zcl.ExceptionDemo01.ExceptionDemo.method(ExceptionDemo.java:11)
     * 	at com.zcl.ExceptionDemo01.ExceptionDemo.main(ExceptionDemo.java:6)
     */
    
    Throwable的成员方法
    方法名 说明
    public String getMessage() 返回此throwable的详细消息字符串
    public String toString() 返回此可抛出的简短描述
    public void printStackTrace() 把异常的错误输出在控制台
    编译时异常和运行时异常的区别

    java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常

    所有的RuntimeException类以及子类被称为运行时的异常,其他的异常都是编译时异常

    • 编译时异常:必须显示处理,否则出现就会发送错误,无法通过编译
    • 运行时异常:无需显示处理,也可以和编译时的异常一样处理
    package com.zcl.Demo;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Demo {
        public static void main(String[] args) {
            // method(); 运行时异常
                method2();
        }
        // 编译时异常
        public static void method2(){
            try {
                String s = "2048-08-08";
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Date d = sdf.parse(s);
                System.out.println(d);
            } catch(ParseException e){
                e.printStackTrace();
            }
        }
    
        //运行时异常 ArrayIndexOutOfBoundsException
        public static void method(){
            try {
                int[] arr = {1,2,3};
                System.out.println(arr[3]);
            }catch(ArrayIndexOutOfBoundsException e){
                e.printStackTrace();
            }
        }
    }
    
  2. throws

格式

throws 异常类名;

注意:这个格式是跟在方法的括号后面的

package com.zcl.Demo2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
throws 异常类名
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        // method();
        
        /*
        通过快捷键:Alt+Ent可以快速选择处理方案
        */
        try {
            method2();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }
    // 编译时异常
    public static void method2() throws ParseException {
        String s = "2048-08-08";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s);
        System.out.println(d);
    }

    //运行时异常 ArrayIndexOutOfBoundsException
    public static void method() throws ArrayIndexOutOfBoundsException{
        int[] arr = {1,2,3};
        System.out.println(arr[3]);
    }
}
  • 编译时异常必须要进行处理:两种处理方案:try…catch或者throws,如果采用throws这种方案,将来谁调用谁处理
  • 运行时异常可以不处理:出现问题后,需要我们回来修改代码

4、自定义异常

格式

public class 异常类名 extends Exception {
	无参构造
	带参构造
}

案例:
自定义异常

package com.zcl.Demo3;

public class ScaoreException extends Exception{
    public ScaoreException(){}; // 无参构造

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

创建老师类

package com.zcl.Demo3;

public class Teacher {
    // throws ScaoreException就不会报错了
    public void checkScre(int score) throws ScaoreException{
        if(score<0||score>100){
            // 产生异常对象,抛出去
            // throw 方法体内部的抛出异常对象的
            // throw new ScaoreException(); // 无参
            throw new ScaoreException("您给的分数有误,分数应该在0-100之间!"); // 带参
        }else {
            System.out.println("分数正常");
        }
    }
}

测试类

package com.zcl.Demo3;

import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入分数:");
        int score = sc.nextInt();

        Teacher t = new Teacher();
        try {
            t.checkScre(score);
        } catch (ScaoreException e) {
            e.printStackTrace();
        }
    }
    /*
    请输入分数:
    120
    com.zcl.Demo3.ScaoreException: 您给的分数有误,分数应该在0-100之间!
        at com.zcl.Demo3.Teacher.checkScre(Teacher.java:10)
        at com.zcl.Demo3.Demo.main(Demo.java:13)
     */
}
throws和thow的区别

throws:

  1. 用在方法声明后面,跟的是异常类名
  2. 表示抛出异常,由该方法的调用者来处理
  3. 表示抛出异常的一种可能性,并不一定会发生这些异常

throw:

  1. 用在方法体内,跟的是异常对象名
  2. 表示抛出异常,由方法体内的语句处理
  3. 执行throw一定抛出了某种异常
上一篇:day14 回调函数 匿名函数 闭包 模拟私有变量 同步 异步


下一篇:Java基础补充.Day14