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可以省略。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...