Java SE 异常(Exception)

本文介绍了Java异常的基本概念,包括Error与Exception的区别,异常分类,处理机制(try-catch-finally与throws),自定义异常及throw和throws的区别。通过实例演示了如何在实际编程中应用这些知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引言

各位好!本章是我在学习Java Exception时所带来的总结和感受,其目的是为了巩固和复习,再者是一起和你们分享学习。异常也是我们学习Java se的重头戏,它发挥着巨大的作用,给开发者和用户都带来了极大的效益。那么废话不多说,让我们一点点的来引入和学习这一章吧!

2.基本概念

顾名思义,异常(Exception)就是Java程序运行时出现了不正常的情况称为异常,注意,开发过程中的语法错误以及业务逻辑错误不能归为异常。而异常又分为两大部分,第一是错误(Error),第二是异常(Exception),咦??那这两者究竟有什么区别呢?

3.异常的分类

一般的,我们把Jvm虚拟机无法解决的严重问题(如:内存不足,爆栈)称为Error,而在编写Java源码时所造成的编译错误以及程序运行时发生的(如:数学格式错误、空指针异常、数组越界、类转化异常等)称为Exception。出现Error时JVM会令程序会直接崩溃并且提示异常的相关信息,而出现Exception的编译错误时,会在我们编辑JAVA源码的时候IDEA会及时提示我们处理编译异常,而当运行程序时出现异常时,Java程序会停留到当前执行的那一行代码,并抛出相关异常,此时,程序有两个选择,第一时选择处理异常,第二是选择不处理(即抛出thorws),相关抛出细节后面再详讲,这里只需大家认识异常的分类就行了(务必清楚)

下面整理出异常类继承体系图方便大家学习

 4.异常的处理

相信大家对异常的概念以及它的种类有了一个大概的认识和了解,好了,那么问题来咯,出现异常我们该怎么做呢,眼巴巴看着它发出异常而置之不理吗?当然,选择不理同样也是一种处理的方式,那么大家试想一下,当一个程度规模十分庞大的时候,运行时比如出现了一个极其微小的错误导致整个程序停止,你们觉得这种处理方式好嘛?几千行的代码在运行到第几行时就卡住了,遇到小小的BUG就卡住了,这种不处理的方式肯定是不合理的,那么该怎么处理呢,其实,有两种方式,第一种就是刚刚提到的不理,第二种就是程序员手动受理(即利用Try-catch-finally)。而不理实质上是将发生的异常封装成异常对象抛(throws)给上一级(调用这个方法的方法),上一级接受到这个异常对象一样有两个处理方式,手动处理或者再向上一级抛出,但要注意,抛出的最高级是JVM,即当经过多次throws抛到JVM的时候,JVM只有一种选择,那就是暴力地把程序奔溃掉提示出相应的异常信息

下面给出Try-catch-finally处理机制示意图

 try {
           //代码.......
        } catch (Exception e) {

            //1.当try块中的代码发生异常时
            //2.系统将异常信息封装成一个异常对象 e,传递给catch
            //3.得到这个异常对象后,可进行各种各样的处理
            //4.当try中代码没有异常时,catch无效

        } finally {
            //无论有没有异常,都要执行这finally代码块里面的代码
        }

 

下面给出throws处理机制示意图

 5.异常处理的细节

5.1Try-catch-finally细节

  1. Java一共提供了两种try的处理方式,一种是try-catch,另一种是try-catch-finally
  2. 允许有多个catch语句,捕获不同的异常,并要求父类的异常在后,子类异常在前(如Exception在前,ArrayOutOfIndexException在后),假设发生异常,只有一个catch能捕获异常对象e
  3. 当Try块中所有代码无异常,不执行catch块中的代码,finally无影响
  4. 当try块中发生异常后,try剩下的所有语句都不再执行。
try {

} catch (NullPointerException e) {
//code

} catch (ArithmeticException e) {
//code

} catch (Exception e) {
//code

} finally {
//code

}

5.2throws细节

  1. 当一个方法中某个异常不知道如何处理时,可以显示地声明抛出异常,表示该方法将不处理这个异常,将给上一级处理
  2. throws抛出的异常类型可以是该方法中异常的类型也可以是它的父类
public static void readFile(String fileName) throws FileNotFoundException//接受方法体中的编译错误并向上抛出{

    new FileInputStream("path....")//读取文件时找不到对应路径下的文件则发出编译错误

}
  1. 对于编译异常,程序中必须处理,即(try-catch或者throws)
  2. 对于运行异常(runtimesexception),如果程序没有处理,则会默认以throws的方式处理
  3. 子类重写父类的方法时,对于异常的抛出,子类重写的方法所抛出的异常要么与父类一致,要么是子类异常
  4. try-catch和throws不要同时出现

6.自定义异常

6.1定义

当程序中出现了某些异常没有再Throwable子类中时,可以自行继承定义异常类,用于描述该错误的信息。

6.2步骤

  1. 自定义异常类并继承Exception或RuntimeException
  2. 继承Exception,则系统认为属于编译异常,(注意:编译异常必须处理(即catch或throws),一般不使用)
  3. 继承RuntimeException,属于运行异常(常用,因为应用场景大且有默认异常处理机制(throws))

下面给出一个自定义异常的案例:

//当我们接受Person对象的年龄时,要求范围在18-100之间,否则抛出一个自定义异常,并打印异常提示

public class Exception2 {
    public static void main(String[] args) /*默认存在throws AgeException*/{
        int age = 2;
        if(!(age >= 18 && age <= 100)){
            throw new AgeException("age is not between 18 to 100");
        }
        System.out.println("age right");
    }
}
class AgeException extends RuntimeException{

    public AgeException(String message) {
        super(message);
    }
}

 代码分析:

上面我们自定义了一个异常类并继承了RuntimeException,定义了一个参数为字符串的构造器,其中message会赋给超类的detialMessage这个字段,在提示异常的时候会显示打印这个字段。在主方法中,由于age不在规定范围内,会new 一个自定义异常对象并抛出,由于时运行时异常,所以底层会默认以throws的方式来处理该异常,即抛给JVM虚拟机,接着JVM会接受并且终止程序并输出对于异常信息。

7.throw和throws的区别

意义位置后面跟的东西
throws异常处理的一种方式方法声明处尾部异常类型
throw手动生成异常对象的关键字方法体中异常对象

8.总结

好啦,上面就是本章所分享的相关异常的知识,希望在督促自己复习的同时能够给大家带来帮助。

我亦无他,唯手熟尔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值