Java研学-异常

一 异常

异于正常状态的显示,即控制台显示结果与预期的不一致

java 复制代码
// 抛出异常java.lang.ArrayIndexOutOfBoundsException
int[] nums = new int[2];
System.out.print(nums[2]);

二 异常分类

1 检测性异常:有称为非运行时异常,一般是在编写代码的过程中编程软件直接报错

2 非检测性异常:也称运行时异常,java为运行时异常单独封装一个类 -- RuntimeException类;是编写代码过程中没问题,但执行并没有获取到预期结果

三 异常类的类结构

1 对于异常信息的解释越详细,异常类的名越长

2 异常类名分为两部分,Exception前:表示对当前异常出现的详细描述,Exception:表示当前类属于是异常类

3 常见异常解析

java 复制代码
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
	at com.play.Play.main(Big.java:12)

Exception:表示当前代码存在异常

in thread "main" :在主线程中

java.long.异常名:当前出现的是什么异常

:值 -- 对当前异常是因为什么原因出现的

at...:表示异常出现的代码行数,一定要看at单词后地址是由我们自己定义的

特点:当一旦出现异常,则其后定义的所有代码不会被执行

四 异常处理机制

1 机制:按照java中规定好的指定规则,完成对数据或业务的指定处理,这种操作就叫机制

2 分类

① 处理异常(常用):由作者主动处理(后期可交给Spring框架完成处理)

② 抛出异常:将异常向上抛出,谁调用,谁处理

3 处理异常

java 复制代码
//  语法格式
try{
	捕获异常:编写可能出现异常的代码
}catch(异常类1 对象1){
	处理异常:完成对指定异常的处理操作
}catch(异常类2 对象2){
	处理异常:完成对指定异常的处理操作
}
finally{
	编写无论是否出现异常都要执行的代码,一般编写关闭资源的代码
}


// 例子
public class Play {                             
    public static void main(String[] args) {   
        int[] nums = new int[0];               
        try {                                  
            nums = new int[2];                 
            System.out.print(nums[2]);         
        } catch (Exception e) {                
            System.err.println("error");       
        } finally {                            
            System.err.println("ok");          
        }                                      
    }                                          
}                                              

4 执行原则

当在try块中捕获异常后,则马上执行catch块中的内容,try块中后续的内容都不执行,当catch块执行后,在执行finally;如果try块中没有捕获异常,执行完try块中所有的内容后执行finally块中的代码

5 执行特点

① 组合操作

try , catch ,finally 可以组合出现

try , catch 可以组合出现

try , finally 可以组合出现

catch , finally 不能组合出现

② 在这三个代码块中间不能编写任何代码,即这三个代码块必须紧密相连

③ try , catch, finally可以嵌套但很少这样使用

④ 当编写多个catch块时,有编写顺序和执行顺序

catch 块既有编写顺序也有执行顺序;必须是按照异常的详细程度,越详细需要编写在前面;只会执行最匹配的catch块,完成处理

⑤ 打印当前异常信息

java 复制代码
public class Play {                                 
    public static void main(String[] args) {       
        int[] nums = new int[0];                   
        try {                                      
            nums = new int[2];                     
            System.out.print(nums[2]);             
        } catch (Exception e) {   
        	// 打印异常信息                 
            e.printStackTrace();                   
        } finally {                                
            System.err.println("ok");              
        }                                          
    }                                              
}                                                  

java是多线程的编程语言,会随机执行操作,处理异常后,执行的操作结果显示位置有时会不一致

6 抛出异常

① throws:抛出一个或多个异常类,定义的位置在参数列表后面,多个异常的时候用 "," 隔开

② throw:抛出指定的某一个异常类对象,定义的位置在方法体中

java 复制代码
public class Play {
    public static void main(String[] args) {
        Integer flag=1;
        try {
            if(flag==1){
                // 抛出异常
                throw new RuntimeException("这个是运行时错误");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.err.println("dw");
            fun();
        }
    }
    // 异常声明 谁调用谁解决
    public static void fun() throws RuntimeException,ArrayIndexOutOfBoundsException{
        System.err.println(1/0);
    }
}

7 java中异常处理机制

①分两种处理方式:处理异常和抛出异常

②通过try块进行异常的捕获,通过catch块对指定的异常进行处理,在finally中去执行无论是否出现异常都要执行的代码

8 final和finally关键字与finalize方法

① 相同点:都是修饰符,都表示最终的含义

② 不同点 : 修饰的内容不同

③ final:能够修饰类(不能被继承),成员字段(必须有初始值),成员方法(不能被重写)

④ finally:能够修饰代码块,表示无论是否出现异常都要执行的操作

⑤ finalize:Java中的一个方法名。Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

五 自定义异常类

根据自己业务的异常情况来定义异常类

java 复制代码
// 定义除数不能为0的异常类
public class DIYException extends Exception{
    // 通过构造器完成异常类的信息展示
    public DIYException(String message){
        // 调用父类构造器完成参数传递
    }
}

使用自定义的异常类

java 复制代码
// 使用自定义的异常类
public class UseException {
    public double div(double num1,double num2)throws DIYException{
        // 满足条件会抛出指定异常信息
        if(num2 == 0){
            throw new DIYException("除数不能为0");
        }
        return num1/num2;
    }
}

测试类进行测试

java 复制代码
// 测试类
public class Test {
    public static void main(String[] args) {
        UseException ue = new UseException();
        try {
            // 有异常声明的类需要进行try catch
            System.err.println(ue.div(1,0));
        } catch (DIYException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
刘一说23 分钟前
资深Java工程师的面试题目(六)数据存储
java·开发语言·数据库·面试·性能优化
江沉晚呤时26 分钟前
EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
java·开发语言·数据库
考虑考虑28 分钟前
JDK17中的Sealed Classes
java·后端·java ee
火鸟241 分钟前
Rust 通用代码生成器:莲花,红莲尝鲜版三十六,哑数据模式图片初始化功能介绍
开发语言·后端·rust·通用代码生成器·莲花·红莲·图片初始化功能
写bug写bug42 分钟前
深入理解Unsafe类
java·后端
星垣矩阵架构师1 小时前
六.架构设计之存储高性能——缓存
java·spring·缓存
刃神太酷啦1 小时前
聚焦 string:C++ 文本处理的核心利器--《Hello C++ Wrold!》(10)--(C/C++)
java·c语言·c++·qt·算法·leetcode·github
啾啾Fun1 小时前
Python类型处理与推导式
开发语言·windows·python
TeamDev1 小时前
在 Java 应用中构建双向数据保护
java·前端框架·全栈
天天摸鱼的java工程师1 小时前
Spring 事务传播机制你了解吗?事务嵌套时你遇到过什么坑?
java·后端·面试