2020.7.24课堂笔记(异常)

课前复习:
1、什么是接口?
使用interface关键字
功能的扩展
方法的聚集
一种约定

2、抽象类和接口的异同点
相同点:都是抽象的,不能被实例化
都包含抽象方法
不同点:抽象类可以有实例方法
接口的属性只能是public static final 类型
抽象类可以定义构造方法(接口不可以)
抽象类的构造方法不是给谁用的
接口不可以有静态方法,但是抽象类可以有

课堂笔记:
Throwable:所以能导致程序无法运行的根类
Error:错误:无法恢复的

Exception:异常:处理之后能正常运行的
确定会发生异常的情况:
Checked异常:确定的异常,提前处理
不确定:
Runtime异常:运行期异常,RuntimeException,遇到了再解决

常见的异常类型:
算术异常:ArithmeticException
空指针异常:NullPointException
数组越界异常:ArrayIndexOutOfBoundException
索引越界异常:IndexOutOfBoundsException
类型转换异常:ClassCastException
输入类型不匹配:InputMismatchException
输入输出异常:IOException
SQL异常:SQLException
非法参数异常:IllegalArgumentException
数字格式化异常:NumberFormatException
必须要被处理的异常:checkedException
未找到类的异常:ClassNotFoundException
异常处理:
try{
有可能发生问题的代码块;
}catch(有可能发生的异常类型 e){
对异常的查看/打印堆栈信息等操作
}finally{
必定会运行的代码
}

throw和throws:
throw:抛出,手动产生异常
必须在条件语句内
throws:声明该方法未处理的异常,必须跟在参数列表后面
RuntimeException 运行期异常的根类,遇到了才解决,不一定要处理
Exception 一定要处理

自定义异常类的过程:
继承某个已知的异常类
有参构造 super(message)调用父类的有参构造
Human

package cn.kgc.kb09;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/24 16:12
 * @Description:
 **/
public class Human {
    int age;

    public void setAge(int age) throws WrongAgeException {
        if(age<=0){
            throw new WrongAgeException("人类的年龄不可以小于0岁");
        }else if(age>=120){
            throw new WrongAgeException("人类的年龄不可以大于120岁");
        }
        this.age = age;
    }


    public static void main(String[] args) {
        Human human = new Human();
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入年龄:");
        try {
            human.setAge(sc.nextInt());
        } catch (InputMismatchException e){
            System.out.println("输入的类型不符合年龄");
            e.printStackTrace();
        }catch (WrongAgeException e) {
            System.out.println("输入的年龄不是人类年龄的范围");
            e.printStackTrace();
        }
    }
}

WrongAgeException:

package cn.kgc.kb09;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/24 16:33
 * @Description:
 **/
public class WrongAgeException extends RuntimeException {
    public WrongAgeException(String message){
        super(message);
    }
}

Test

package cn.kgc.kb09;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/24 14:20
 * @Description:
 **/
public class Test {

    public void divide(int a,int b) throws ArithmeticException{
        System.out.println(a/b);//正常情况下,异常放在最后一步去处理比较好
        //但是如果复用性比较高的情况下,处理掉异常,不然实际调用的时候,每个都要处理一次
    }

    public static void main(String[] args) {
        Test t=new Test();
        System.out.println("程序开始");
        try {
            t.divide(1, 0);
        }/*catch(ArithmeticException e){
            e.printStackTrace();
            System.err.println("请注意有什么不一样");
            //不执行的唯一情况
            System.exit(1);
        }*/finally {
            System.out.println("这里是最终块");
            //有些时候,异常可以不去处理,但是后续的步骤一定要做完
            // 关闭释放资源
        }
        //Class.forName();
        System.out.println("程序结束");

        /*int a=1;
        int b=0;
        System.out.println("程序开始");
        try {//把可能出现问题的代码放在里面
            System.out.println(a / b);
        }catch (ArithmeticException e) {
            //System.out.println("分母为0,不合法!");
            e.printStackTrace();//打印堆栈信息,把栈内存当中出现的一些情况打印出来
            //由于是分成两条线在运行,所以打印的顺序并不是固定的,这两条线有个名称叫线程
            System.out.println(e.getMessage());
            //System.out.println(e.getCause());
        }
        System.out.println("程序继续运行");*/

    }
}

TestReturnException:

package cn.kgc.kb09;

import java.util.Arrays;

/**
 * @Author: ChaoKeAiMuZhi
 * @Date: 2020/7/24 15:10
 * @Description:
 **/
public class TestReturnException {
    //我声明了啥,我就抛出啥
    public int[] divide(int a, int b) throws WrongAgeException{
        int[] rst = {1,2};
        try {
            if(true){
                throw new WrongAgeException("年龄不正确的异常,应该在1~100之间");
            }

            //只要满足其中一条就不会看其他的,和if-else类似
            //rst=null;
            //=赋值符,是从右边往左边运行的,先右边有值再赋值给左边
            rst[3] = a / b;
            //rst[1] = a / b;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界");
        }catch (ArithmeticException e) {
            return rst;
        }catch (NullPointerException e){
            //空指针没有办法通过捕获处理掉,空指针就是空指针,把finally  rst[0] = -2 注释掉就可以了
            System.out.println("空指针异常");
        }/*catch(Exception e){
            e.printStackTrace();
        }*/
        finally {
            //rst[0] = -2;
        }
        return new int[3];
    }

    //main方法 throws Exception
    public static void main(String[] args)  {
        TestReturnException testReturnException = new TestReturnException();
        //testReturnException.divide(1,0);
        try {
            int[] str=testReturnException.divide(1,1);
        } catch (WrongAgeException e) {
            e.printStackTrace();
        }
        System.out.println("程序正常运行");

    }
}

你可能感兴趣的:(笔记)