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();
        }
    }
}
相关推荐
用户0332126663675 分钟前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧7 分钟前
ThreadLocal实现原理与应用实践
java
若水不如远方14 分钟前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
用户74936368484318 分钟前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing37 分钟前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员
间彧1 小时前
Spring Boot集成Spring Security 6.x完整指南
java
xiezhr2 小时前
用户只需要知道「怎么办」,不需要知道「为什么炸了」
java·api·接口设计规范
xiezhr2 小时前
接口设计18条军规:写给那些半夜被“502”叫醒的人
java·api·restful
RainbowSea11 小时前
12. LangChain4j + 向量数据库操作详细说明
java·langchain·ai编程
RainbowSea11 小时前
11. LangChain4j + Tools(Function Calling)的使用详细说明
java·langchain·ai编程