Java—异常体系
创始人
2024-03-18 05:33:43
0次

文章目录

  • 异常和错误
  • java异常的分类:
    • 非运行时异常
    • 运行时异常
  • 受检异常(非运行时异常)如何处理?
    • 1、try catch finally
      • 为什么要用try catch finally
    • 2、throws
  • Throw和Throws的区别
  • JVM是如何处理异常的
  • try-catch-finally中哪个部分可以省略

————————————————————————————————

异常和错误

下面这就是异常(exception)
在这里插入图片描述
错误:(Error)是JVM产生和抛出的,一般情况下在编译器上看不到错误
下面这种就是Error(这个是栈溢出)
在这里插入图片描述

java异常的分类:

java异常可以分为:受检异常(非运行时异常)、非受检异常(运行时异常)

非运行时异常

受检异常(非运行时异常)
——>(代码从语法角度必须处理的异常,如果不处理,程序不能编译)
——>在编译器当中报错,需要我们解决该异常才能继续执行
非运行时异常(受检异常) :是RuntimeException以外的异常,类型上都是属于Exception类,这些异常必须处理。
常见受检异常:SQLException(访问关系数据库产生的异常),IOException(在读取文件时产生的异常),ClassNotFoundException(试图使用一个不存在的类),或者程序员自定义的异常。

运行时异常

非受检异常(运行时异常)
——>(代理的逻辑错误产生的)
——>在编译器当中不报出异常,在程序运行阶段报出异常
运行时异常(非受检异常) :都是由RuntimeException类(—>是Exception的一个子类)或者其子类产生的,这些异常程序可以选择处理,或者选择不处理。
常见非受检异常:NullPointerException(空指针访问),IndexOutOfBoundsException(数组角标越界),ArithmeticException(数学运算中除以0的情况),IIIegalArgumenException(传递给方法的参数非法或不合适)
在这里插入图片描述
在这里插入图片描述

受检异常(非运行时异常)如何处理?

1、try catch finally

try:尝试运行
catch:运行不成功,触发
finally:一定会执行的代码(不管是成功还是失败)

  • finally:无论try是否成功,finally一定会执行
  • finally通常来做资源清除工作,并比如关闭文件等等

为什么要用try catch finally

为了:解决异常:一旦使用了try…catch,那么即使出现异常,后续代码也能继续执行代码
在这里插入图片描述

2、throws

抛出异常,表示该方法不处理这个异常,交给 该 方法的调用者 去处理此异常(main方法处理此异常)
throw——自定义异常的关键字
在这里插入图片描述
注意:
JDK所抛出的所有的异常的父类都是Expectation类

Throw和Throws的区别

Throws:

  • 用来声明一个方法可能产生的所有异常,不能做任何处理而是将异常往上传,谁调用就抛给谁
  • 用在方法声明后面,跟的是异常类名
  • 可以跟多个异常类名,用逗号隔开
  • 可以抛出异常,由该方法的调用者来处理
  • 表示出现异常的一种可能性,并不一定会发生异常

Throw:

  • 抛出的是一个具体的异常类型
  • 用在方法体内,跟的是异常的对象名
  • 只能抛出一个异常对象名
  • 表示抛出异常,由方法体内的语句处理
  • throw抛出了异常,执行,throw则一定会抛出某种异常

JVM是如何处理异常的

在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给JVM的过程称为抛出异常。可能 有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。

JVM会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当JVM发现可 以处理异常的代码时,会把发生的异常传递给它。如果JVM没有找到可以处理该异常的代码块,JVM就 会将该异常转交给默认的异常处理器(默认处理器为JVM的一部分),默认异常处理器打印岀异常信息 并终止应用程序。

try-catch-finally中哪个部分可以省略

try只适合处理运行时异常,try+catch适合处理运行时异常 +普通异常。也就是说,如果你只用try去处理普通异常却不加以catch处理,编译是通不过的,因为编译 器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以catch可以省略。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...