【JAVA SE】一篇文章带你弄懂JAVA中的异常

大家好呀,我是制药💊,今天来给大家讲解异常相关的知识,文章有点长希望大家可以收藏起来慢慢看,作为初学者我也是写来方便日后的复习,制药和大家一起学习一起加油!😙

在这里插入图片描述

✨如果喜欢的话,欢迎大家关注,点赞,评论,收藏!😁
🌟本人博客的首页:crisp制药
😺本人是一个JAVA初学者,分享一下自己的所学,如果有错误,希望大家能告知,谢谢!

在这里插入图片描述

📣异常概述与异常体系结构

一、异常机制的概述📧

Error:JAVA虚拟机无法解决的严重问题
Exception:其他因变成错误或偶然的外在因素导致的一般性问题

异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。
(1)编译错误是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。
(2)运行时错误是因为程序在执行时,运行环境发现了不能执行的操作。
(3)逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。

2、常见异常📝
//NullPointerException:空指针异常
public static void main(String[] args){
    int[] arr=null;
    System.out.println(arr[0]);//空指针异常
}
//ArrayIndexOutOfBoundsException:数组角标越界
public static void main(String[] args){
    int[] arr=new int[3];
    System.out.println(arr[3]);//数组角标越界
}
//ClassCastException类型转换异常
public static void main(String[] args){
    Object obj=new Date();
    String s=(String)obj;//类型转换异常
}
//NumberFormatException数值转换异常
public static void main(String[] args){
    String s="abc";
    int num=Intger.parseInt(s);//数值转换异常
}
//InputMismatchException输入类型异常
public static void main(String[] args){
    Scanner scanner=new Scanner(System.in);
    int score=scanner.nextInt();
    System.out.println(score);//输入“abc”,输入类型错误
}
//ArithmeticException算数异常
public static void main(String[] args){
    int a=10;
    int b=0;
    System.out.println(a/b);//算数异常
}
3、try-catch-finally📚

异常的处理:抓抛模型
“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码出生成一个对应异常类的对象并将此对象抛出,其后的代码就不再执行。
“抓”:可以理解为异常处理的方式:①try-catch-finally ②throws

try-catch-finally实际例子:

try{
    //可能出现异常的代码
}catch(异常类型1 变量名1){
    //处理异常的方式1
}catch(异常类型2 变量名2){
    //处理异常的方式2
}
......
finally{
    //一定会执行的代码
}

public static void main(String[] args){
    String s="abc";
    try{
        int num=Intger.parseInt(s);
        System.out.println("-----1-----");
    }catch(NumberFormatException e){
        System.out.println("出现数值转换异常");//出现异常时采取的操作
    }
    System.out.println("-----2-----");
}
//1不会输出,2会输出,因为一旦出现异常下面的代码就不再执行

📙注意:
finally是可选的,可以不写,使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型去catch中进行匹配,一旦try中的对象匹配到某一个catch的时候就会进入异常的处理,一旦处理完成,如果没有写finally,就跳出当前的try-catch结构,继续执行其后的代码。

对异常的常用操作:①getMessage()返回String;②printStackTrace()

public static void main(String[] args){
    String s="abc";
    try{
        int num=Intger.parseInt(s);
    }catch(NumberFormatException e){
        System.out.println(e.getMessage());//输出For input string: "abc"
         e.printStackTrace();//非常具体的异常的位置和信息
    }
}

📘finally的使用:即使catch中也出现了异常,try和catch里面还有return语句,finally都会执行,就是不管怎样都一定会执行

public static void main(String[] args){
    int a=10;
    int b=0;
    try{
        System.out.println(a/b);//算数异常
    }catch(ArithmeticException e){
        e.printStackTrace();
    }finally{
        System.out.println("发生异常了");
    }
}

📗总结:finally的使用场景:数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源释放,此时的资源释放需要声明在finally中。
try-catch-finally结构可以嵌套,使用try-catch-finally处理编译时已成,使得程序在编译时不再报错,但运行时仍可能保持,相当于把编译时可能出现的异常延迟到运行时出现。一般不针对运行时异常使用try-catch-finally,针对编译时异常需要做处理。

throws关键字的使用📖

public static void main(String[] args){
    try{//main方法对异常进行处理
        method();
    }catch(ArithmeticException e){
        //处理
    }
}
public static void method() throws ArithmeticException{//抛到main方法
    int a=10;
    int b=0;
    System.out.println(a/b);//算数异常
}

throws+异常类型写在方法的声明处,指明此方法执行时,可能会抛出的异常类型,一旦方法体执行时出现异常仍然会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时就会被抛出,异常代码后续的代码就不再执行(和try-catch-finally的不同点)。

📕方法重写的规则
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(体现在执行优先级)

📔开发中异常处理的选择
如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能用throws
执行的方法A中先后调用了其他方法,方法和方法之间又有递进关系,这几个方法用throws,A中用try-catch-finally
手动抛出异常:throw,异常的产生:①自动生成 ②手动抛出

📓throw与throws的区别
throw:抛出一个异常类的对象,生成异常对象的过程,声明在方法体内
throws:属于异常处理的方式,声明在方法体处

用户自定义异常类
继承于现有的异常结构:RuntimeException、Exception
提供全局常量:serialVersionUID,序列版本号
提供重载的构造器

public class EcDef extends Exception{
    static final long serialVersionUID=-33875164229948L;
    public EcDef(){
    }
    public EcDef(String msg){
        super(msg);
    }
}

📒总结
今天学习了异常的概念,以及异常的处理方法:try-catch-finally,以及throws关键字
觉得写的还不错的朋友可以三连支持一下哦~

在这里插入图片描述

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值