首页 > 其他分享 >第六章:异常

第六章:异常

时间:2024-03-05 11:55:18浏览次数:17  
标签:catch 调用者 处理 编译 finally 第六章 异常

1. 异常概述

1.1. 什么是异常?有什么作用?

  1. Java中的异常是指程序运行时出现了错误或异常情况,导致程序无法继续正常执行的现象。例如,数组下标越界、空指针异常、类型转换异常等都属于异常情况。
  2. Java提供了异常处理机制,即在程序中对可能出现的异常情况进行捕捉和处理。异常机制可以帮助程序员更好地管理程序的错误和异常情况,避免程序崩溃或出现不可预测的行为。
  3. 没有异常机制的话,程序中就可能会出现一些难以调试和预测的异常行为,可能导致程序崩溃,甚至可能造成数据损失或损害用户利益。因此,异常机制是一项非常重要的功能,是编写可靠程序的基础。
  4. 异常机制在java中的作用:提高程序的健壮性
public class ExceptionTest01 {
    public static void main(String[] args) {
        int a = 10;
        int b = 2;
        if(b == 0){
            System.out.println("除数不能为0");
            return;
        }
        int c = a / b;
        System.out.println(a + "/" + b + "=" + c);

        String s = null;
        s.toString(); // 这里会发生空指针异常,程序执行到这里JVM就会在底层new一个NullPointerException类型的实例。

        //String s2 = null;
        //s2.toString(); // 在底层new一个NullPointerException类型的实例。
    }
}

1.2. 异常在Java中以类和对象的形式存在

2. 异常继承结构

img

  1. 所有的异常和错误都是可抛出的。都继承了Throwable类。

  2. Error是无法处理的,出现后只有一个结果:JVM终止。

  3. Exception是可以处理的。

  4. Exception的分类:

    1. 所有的RuntimeException的子类:运行时异常/未检查异常(UncheckedException)/非受控异常
    2. Exception的子类(除RuntimeException之外):编译时异常/检查异常(CheckedException)/受控异常编译时异常和运行时异常区别:
  5. 编译时异常和运行时异常区别

    1. 编译时异常特点:在编译阶段必须提前处理,如果不处理编译器报错。
    2. 运行时异常特点:在编译阶段可以选择处理,也可以不处理,没有硬性要求。
    3. 编译时异常一般是由外部环境或外在条件引起的,如网络故障、磁盘空间不足、文件找不到等
    4. 运行时异常一般是由程序员的错误引起的,并且不需要强制进行异常处理
    5. 注意:编译时异常并不是在编译阶段发生的异常,所有的异常发生都是在运行阶段的,因为每个异常发生都是会new异常对象的,new异常对象只能在运行阶段完成。那为什么叫做编译时异常呢?这是因为这种异常必须在编译阶段提前预处理,如果不处理编译器报错,因此而得名编译时异常。

3. 自定义异常

3.1. 自定义异常的步骤

第一步:编写异常类继承Exception/RuntimeException

第二步:提供一个无参数构造方法,再提供一个带String msg参数的构造方法,在构造方法中调用父类的构造方法 ,用super(String)

代码演示:

img

4. 异常的处理

4.1. 异常的处理包括两种方式

  1. 声明异常:类似于推卸责任的处理方式

    1. 在方法定义时使用throws关键字声明异常,告知调用者,调用这个方法可能会出现异常。这种处理方式的态度是:如果出现了异常则会抛给调用者来处理。
  2. 捕捉异常:真正的处理捕捉异常

    1. 在可能出现异常的代码上使用try..catch进行捕捉处理。这种处理方式的态度是:把异常抓住。其它方法如果调用这个方法,对于调用者来说是不知道这个异常发生的。因为这个异常被抓住并处理掉了。

异常在处理的整个过程中应该是:声明和捕捉联合使用。

什么时候捕捉?什么时候声明?

  • 如果异常发生后需要调用者来处理的,需要调用者知道的,则采用声明方式。否则采用捕捉。

4.2. 第一种处理方式:声明异常(throws关键字)

如果一个异常发生后希望调用者来处理的,使用声明异常(俗话说:交给上级处理)

public void m() throws AException, BException... {}

如果AException 和 BException都继承了XException,那么也可以这样写:

public void m() throws XException{}

调用者在调用m()方法时,编译器会检测到该方法上用throws声明了异常,表示可能会抛出异常,编译器会继续检测该异常是否为编译时异常,如果为编译时异常则必须在编译阶段进行处理,如果不处理编译器就会报错。

如果所有位置都采用throws,包括main方法的处理态度也是throws,如果运行时出现了异常,最终异常是抛给了main方法的调用者(JVM),JVM则会终止程序的执行。因此为了保证程序在出现异常后不被中断,至少main方法不要再使用throws进行声明了。

发生异常后,在发生异常的位置上,往下的代码是不会执行的,除非进行了异常的捕捉。

4.3. 第二种处理方式:捕捉异常 (try...catch...关键字)

如果一个异常发生后,不需要调用者知道,也不需要调用者来处理,选择使用捕捉方式处理。

try{
	// 尝试执行可能会出现异常的代码
	// try块中的代码如果执行出现异常,出现异常的位置往下的代码是不会执行的,直接进入catch块执行
}catch(AException e){
	// 如果捕捉到AException类型的异常,在这里处理
}catch(BException e){
	// 如果捕捉到BException类型的异常,在这里处理
}catch(XException e){
	// 如果捕捉到XException类型的异常,在这里处理
}// 当try..catch..将所有发生的异常捕捉后,这里的代码是会继续往下执行的。

catch可以写多个。并且遵循自上而下,从小到大。

Java7新特性:catch后面小括号中可以编写多个异常,使用运算符“|”隔开。

5. 异常的常用方法

获取异常的简单描述信息:

  • exception.getMessage();
  • 获取的message是通过构造方法创建异常对象时传递过去的message。

打印异常堆栈信息:

  • exception.printStackTrace();

要会看异常的堆栈信息:

  • 异常信息的打印是符合栈数据结构的。
  • 看异常信息主要看最开始的描述信息。看栈顶信息。

6. finally语句块

finally语句块中的代码是一定会执行的。

finally语句块不能单独使用,至少需要配合try语句块一起使用:

  • try...finally
  • try...catch...finally

通常在finally语句块中完成资源的释放

  • 资源释放的工作比较重要,如果资源没有释放会一直占用内存。
  • 为了保证资源的关闭,也就是说:不管程序是否出现异常,关闭资源的代码一定要保证执行。
  • 因此在finally语句块中通常进行资源的释放。

final、finally、finalize分别是什么?

  • final是一个关键字,修饰的类无法继承,修饰的方法无法覆盖,修饰的变量不能修改。
  • finally是一个关键字,和try一起使用,finally语句块中的代码一定会执行。
  • finalize是一个标识符,它是Object类中的一个方法名。

代码演示:

img

7. 方法覆盖与异常

方法重写之后,不能比父类方法抛出更多的异常,可以更少。

img

标签:catch,调用者,处理,编译,finally,第六章,异常
From: https://www.cnblogs.com/NorthPoet/p/18053698

相关文章

  • java 异常初识
    什么是异常◆实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等◆软件程序在运行过程中,非......
  • 记一次openfeign反序列化异常复盘
    前言之前业务部门有2个通用响应类,一个是负责和前端交互的响应类AjaxResult,一个是负责和后端RPC接口交互的响应类RpcResult。一开始这两个响应类的值字段都一样,形如下 privateBooleansuccess; privateStringmessage; privateIntegercode; privateTdata;因为前端和......
  • C++ 异常处理
    菜鸟教程C语言中文网程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:1)语法错误在编译和链接阶段就能发现,只有100%符合语法规则的代码才能生成可执行程序。语法错误是最容易发现、最容易定位、最容易排除的错误,程序员最不需要担心的就是这种错误。2)逻辑错......
  • JSON.parse解析字符串报错-SyntaxError: Unexpected token ‘ in JSON at position 报
    “SyntaxError:Unexpectedtoken’inJSONatposition”报错原因是因为解析的字符串对象中,JSON.parse无法识别;JSON.parse可以将标准的json类型数据转换为JavaScript对象,如果数据不是正确的json类型的数据则会控制台报错,可能会阻断代码的正常运行我们可以写一个函数来......
  • 《程序是怎样跑起来的》第六章观后感
    《程序是怎样跑起来的》第六章为我们揭示了计算机程序运行的深层逻辑,这一章节不仅仅是对前面内容的延伸,更是对整个程序运行机制理解的一次飞跃。在阅读本章后,我深刻体会到了计算机程序从编写到执行的全过程,以及操作系统在其中扮演的关键角色。首先,本章详细介绍了编译器如何将高级......
  • 断电引起文件scn异常数据库恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:断电引起文件scn异常数据库恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]由于异常断电,数据库最初启动报错FriMar0108:41:172024ALTERDATABASE  MOUNTSucces......
  • python——异常
        在原本的tryexcept结构的基础上,Python 异常处理机制还提供了一个else块,也就是原有tryexcept语句的基础上再添加一个else块,即tryexceptelse结构。使用else包裹的代码,只有当try块没有捕获到任何异常时,才会得到执行;反之,如果try块捕获到异常,即便调用对......
  • 异常(异常是python对象) 和 自定义异常类
    Python提供了异常和断言来处理程序在运行过程中出现的异常和错误什么是异常?分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用raise手动引发的异常。异常是在程序执行过程中......
  • 《程序是怎么跑起来的》第六章
    《程序是怎么跑起来的》第六章观后感看完第六章后,我对程序运行的整个过程有了更深入的理解。在编程的世界里,每一段代码的执行都需要经过编译、链接、加载和运行等步骤。在这个过程中,我们需要考虑到许多细节,如内存管理、错误处理、并发编程等。通过学习第六章,我意识到编程不仅仅是......
  • 第六章 字符串
    第6章字符串一、字符编码格式最早字符串编码:ASCIIGB2312-1980:中国定制的中文编码,1个字节兼容ASCII,2个字节表示中文GBK:是GB2312-1980的扩充CP936:是微软在GBK上扩充UTF8:1个字节兼容ASCII,3个字节表示汉字二、转义字符与原始字符串转义字符含义转义字符含义\b退......