ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-7-29 第七组 异常的处理

2022-07-29 19:02:21  阅读:32  来源: 互联网

标签:语句 第七 处理 29 try finally 2022 catch 异常


异常概述

什么是异常?Java代码在运行时期发生的问题就是异常。

在Java中,把异常信息封装成了一个类。当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置、原因等)。

Throwable

Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息

Error(错误)

 Error 类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。 此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、
NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;
StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。 这些错误是不受检异常,非代码性错误。
因此,当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的!

Exception(异常)

程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。

运行时异常

  都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。 运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,

也没有用throws子句声明抛出它,也会编译通过。

非运行时异常

(编译异常) 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

*异常关键字 try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,try语句块内发生异常时,异常就被抛出。

*catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。

*finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。

*throw – 用于抛出异常。

*throws – 用在方法签名中,用于声明该方法可能抛出的异常。

异常处理

JVM默认处理方式

如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行并且还终止了程序,异常后面的代码将不在执行

try {
	//需要被检测的语句。
}
catch(异常类 变量) { //参数。
	//异常的处理语句。
}
finally {
	//一定会被执行的语句。
}

try...catch的执行顺序:

	 * 	首先执行try语句
	 * 	如果发现异常,异常下面的代码不在执行,直接跳入catch语句中,catch语句结束后,整个try...catch结束
	 * 	如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句

throws方式处理异常

抛出去当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常
throws使用:
权限修饰符 返回值类型 方法名(形参列表) throws 异常类型1,异常类型2….{
}

多异常处理

对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

image

void show(){ //不用throws 
	try{
		throw new Exception();//产生异常,直接捕获处理
	}catch(XxxException e){
//处理方式	
	}catch(YyyException e){
//处理方式	
	}catch(ZzzException e){
//处理方式	
	}
}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

Throwable常用方法

String getMessage()  返回此 throwable 的详细消息字符串
String toString()  返回此 throwable 的简短描述
void printStackTrace()  打印异常的堆栈的跟踪信息
  • 我们为什么要手动抛异常?

  • 因为要配合全局异常处理机制来解决问题

    finally使用格式:
    try{
    }catch(异常类型 异常变量){
    }finally{
    //释放资源的代码
    }

finally不是任何时候都是能执行的,finally遇见如下情况不会执行

在前面的代码中用了System.exit()退出程序。
finally语句块中发生了异常。
程序所在的线程死亡。
关闭CPU。

image

记住图中的执行顺序:第一个红框里的注解,因为finally 的原因所有是图中的执行顺序。

标签:语句,第七,处理,29,try,finally,2022,catch,异常
来源: https://www.cnblogs.com/ychptz/p/16533232.html

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有