Java异常教程

异常

学习网站:
https://www.bilibili.com/video/BV1GU4y1A7J4/?p=7&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=3529d60bf9f6a997966da275bb45f972

/0异常

空字符串 空指针异常

异常:程序运行过程 发生不正常的事件 中断运行的程序

程序不正常事件 对不正常事件进行描述的对象

常见异常

  1. 除数不能为0
  2. 空指针异常()
  3. 数据下标越界()
  4. 类型转换异常(ClassCastException)

3.异常的分类

出门前 天气 燃气卡

出门后:等公交

​ 坐公交

  1. 编译 Exception
    1. 程序编译异常
  2. 运行
    1. 运行时候出现异常
  3. 错误
    1. java虚拟机抛出的异常 如栈溢出

image-20250202131315385

二、异常处理

程序出现异常 java虚拟机 帮我们处理 他会直接结束程序执行

1.自己处理

通过try catch 语句块

1.1单个异常

try{
//可能异常语句
}catch(要捕获的异常类型  起个异常名称){
//
}finally{
//释放资源  最后一定执行
}


image-20250202134719345

如果catch捕获异常不匹配则异常给java虚拟机输出

image-20250202135153127

分别捕获

ArithmeticException e 可以

NullPointerExceptrion e 

Exception e 可以

RuntimeException e 可以


因为ArithmeticException异常 父类可以接受子类

image-20250202135455577

1.2 多个异常处理

多个异常try?

image-20250202135831453

只要看到一个异常 后面就不再执行

子类异常在前 父类异常在后 保证 小范围异常捕获不到 最后父类异常保底

image-20250202140251764

捕获空指针异常 输出堆栈错误信息

什么异常

红色:什么类声明方法出现异常

image-20250202144519657

除0 运行异常

image-20250202144955461

java.lang.ArithmeticException
这个类异常

这个类异常

捕获一下:

2.将异常抛出

what:

​ 自己处理不了 丢到上层

image-20250204172239266

上层来处理:try catch finally

image-20250204172258742

抛出多个异常

image-20250204172351561

throws 后面语句都不在处理

所以主方法一般都不抛出 而是直接处理

接口向外声明要抛出异常 实现时候可以缩小异常范围

image-20250204173000862

三、throw关键字

throws throw throwable区别

throws:

what:

​ 函数的异常抛出

throw:

what:

​ 动词抛出异常对象 内部处理/抛给外部

且返回上一级

throw throws区别:

  1. throw抛出的异常

    1. 内部处理

      1. 我们可以在方法体内部设置好“接球手”!这些“接球手”就是 try-catch 块。当 throw 把“山芋”扔出来后,如果在同一方法体内存在相应的 catch 块,那么这位“接球手”就能稳稳地接住它,并按照预设的方式进行处理。这样,不仅避免了程序直接崩溃,还能优雅地解决这个问题,让程序继续平稳运行下去。
        
    2. thorws抛给外部

运行时异常:

​ what:

​ 运行时候检查出来异常

​ how:

​ 编译时候检查不出来 所以不用抛出异常

函数体抛出异常 主方法要接收处理 然后继续主方法

how use:

​ 内部处理 / 抛给外部

image-20250204174033189

编译异常:

what:

​ 编译不通过 有异常

example:
1.throw new ParseException(“解析错误”,1)
throw new ParseException("解析错误",1)

image-20250204174809271

2.sdf.parse(str)
public static void show() throws ParseException{
    String str = "2020-01-05";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    sdf.parse(str); //出现异常
    
}

image-20250204175510878

solve:

​ 在编译时候就要抛出 / 处理

fact1: 运行异常
/*
    what:
        运行异常
     */
    public static void exceptionThrowDispose(){
        int i = 100;
        try {
            System.out.println( i / 0);
        }catch(Exception e){
            System.out.println("运行异常 除0异常。。");
            e.printStackTrace();
        }
    }

image-20250205185700981

e.printStackTrace();

返回 异常种类 java.lang.ArithmeticException: / by zero

异常来自哪个类 哪个方法 多个函数一层一层输出调用关系

at throwsKeyWord.exceptionThrowDispose(throwsKeyWord.java:35)
at throwsKeyWord.main(throwsKeyWord.java:12)

what:

​ throw 隐式 抛到主函数 外部无法识别

public static double exceptionThrowDispose(){
        int a = 100;
        int b = 0;
        if(b == 0){
            throw new ArithmeticException("除0异常....");
        }
        return a / b;
    }

throw 显式 抛出 异常对象

/*
    what:
        throw 显式 抛出给主函数
     */
    public static double exceptionThrowDispose2() throws ArithmeticException{
        int a = 100;
        int b = 0;
        if(b == 0){
            throw new ArithmeticException("除0异常....");
        }
        return a / b;
    }

arithmeticException() 函数对象构造函数

image-20250205190242747

fact2: 编译异常

处理:

try {
            exceptionThrowDispose3();
        }catch(Exception e) {
            System.out.println("编译异常处理。。。。。");
        }

public static void exceptionThrowDispose3() throws Exception{
        int a = 100;
        if(a == 100){
            throw new ParseException("解析错误", 1);
        }
    }

image-20250205191935816

编译异常2:

what:

​ 如果不抛出/处理 转化错误抛出异常就会出现编译异常

public static void exceptionThrowDispose4()  {
    String str = "2020---10112-051";
    /*
    what:
        设置简单数据格式的格式
     */
    SimpleDateFormat  sdf = new SimpleDateFormat("yyyy-MM-dd");
    //转化成parse对象
    /*
    why:
        有时候字符串无法与parse格式对应 会抛出异常
        如果你不考虑这种异常那么就会编译异常
     */
    sdf.parse(str);
}

四、finally关键字

public class finallyKeyWord {


    public static void main(String[] args) {



//        finallyShow3();
        System.out.println(returnFinallyCombine());
    }


    /*
    finally
        what:
            配合try catch  一般用于资源释放 只要进入try(除非exit退出 但是return后还是会执行finally)那么一定会执行finally
         how show:
            try 分别进入/不进入catch finally
         */
    public static void finallyShow1(){
        int a = 100;
        int b = 10;

        try{
            if( a == 100){
                System.out.println("进入try....");
            }
        }catch(Exception e){
            System.out.println("进入catch....");
            e.printStackTrace();
        }finally{
            System.out.println("finally....");
        }
    }
    public static void finallyShow2(){
        int a = 100;
        int b = 0;

        try{
            System.out.println(a / b);
        }catch(Exception e){
            System.out.println("进入catch....");

        }finally{
            System.out.println("finally....");
        }
    }
    /*
    what:
        try中exit finall不再执行
         return 退出  finally依旧执行 甚至进入catch return 优先级就这么低吗?
     */
    public static void finallyShow3(){
        int a = 100;
        int b = 0;

        try{
            System.out.println(a / b);
//            return;
            System.exit(1);
        }catch(Exception e){
            System.out.println("进入catch....");

        }finally{
            System.out.println("finally....");
        }
    }
    /*
    what:
        面试题try中 return返回值在try 与 finally中
        answer: return后 返回值藏在一个地方保存下来 finally操作x不影响保存的值
            如果try与finally同时return  try先修改局部值 finally 再次修改局部值 最后按照finally确定返回值
     */
    public static int returnFinallyCombine(){
        int x = 1;
        try{
            x++;
            return x;

        }catch(Exception e){
            System.out.println("进入catch...");
        }finally{
            ++x;
            System.out.println(x);
//            return x;
        }
        return x;
    }
}

面试题2:

final finally finalize三者区别

  • final: 修饰类 能被继承 修饰方法不能被重写 修饰变量变常量
  • finally是try catch 一部分 只要进入try 就会进入finally return 无法中断finally执行
  • finalize:object中的方法,在垃圾回收的时候会用的方法

五、自定义异常

1.继承于父亲 接收父亲的全部操作属性

故可以设置message 当作异常抛出

public class defineException {

    public static void main(String[] args) {

        /*
        what:
            处理分数异常
         */
        try{
            System.out.println(getSorce());
        }catch(sorceException e){
            e.printStackTrace();
        }

        System.out.println("********");
    }

    /*
    what:
        返回分数
     */
    public static double getSorce() throws sorceException{
        double sorce = 999;
        /*
        分数不合法
         */
        if(sorce < 0 || sorce > 100){
            throw new sorceException("分数不合法");
        }

        return sorce;
    }

}
/*
what:
    自定义异常类之分数异常类 继承exception异常
how extend:
    无参 有参构造
    继承了exception所有属性可以抛出 可以有异常信息
 */

class sorceException extends Exception{
    /*
    what:
        无参构造
     */
    sorceException(){}
    /*
    what:
        携带信息构造 放入栈中
     */
    sorceException(String message){
        super(message);

    }
}
``
 throws sorceException{
        double sorce = 999;
        /*
        分数不合法
         */
        if(sorce < 0 || sorce > 100){
            throw new sorceException("分数不合法");
        }

        return sorce;
    }

}
/*
what:
    自定义异常类之分数异常类 继承exception异常
how extend:
    无参 有参构造
    继承了exception所有属性可以抛出 可以有异常信息
 */

class sorceException extends Exception{
    /*
    what:
        无参构造
     */
    sorceException(){}
    /*
    what:
        携带信息构造 放入栈中
     */
    sorceException(String message){
        super(message);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值