首页 > 编程语言 >Java--异常

Java--异常

时间:2024-08-08 09:06:56浏览次数:11  
标签:语句 Java -- 抛出 try finally catch 异常

目录

概念

异常就是程序在编译时发生的意想不到的情况,一般而言分为两类:错误(Error)和异常(Exception)

Java异常类结构图

Error类和Exception类区别

Error类:一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理

Expection:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件

​ (1)SQLException:该异常提供关于数据库访问错误或其他错误的信息。

​ (2)RuntimeException` 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类

​ (3)IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。

Exception异常分类

运行异常(RuntimeException)

ArrithmeticException
MissingResourceException
ClassNotFoundException

NullPointerException
lllegalArgumentException
ArrayIndexOutOfBoundsException
UnkownTypeException

非运行时异常(受检查异常类)

EOFException
FileNotFoundException

异常处理机制

抛出异常(throw与throws用法)->捕获异常(处理顺序)->异常传播

throw、throws关键字

throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出 的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。 throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。 当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,看看如何 使用这两个关键字:

public static void test3() throws Exception{ //抛出一个检查异常 throw new Exception("方法test3中的Exception"); }

Throwable类中的常用方法

getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。

getMessage():返回异常的消息信息。 printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。

异常处理的基本语法

在java中,异常处理的完整语法是: try{ //(尝试运行的)程序代码 }catch(异常类型 异常的变量名){ //异常处理代码 }finally{ //异常发生,方法返回之前,总是要执行的代码 }

以上语法有三个代码块: try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。

catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,表示可捕获异常类型。当 try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对 象。catch语句可以有多个,用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了。通过异常对象可以获取异常发生时完整的 JVM堆栈信息,以及异常信息和异常发生的原因等。

finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方 法返回前执行。目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性

try、catch、finally三个语句块应注意的问题

第一、try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个

第二、try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面

第三、多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。

标签:语句,Java,--,抛出,try,finally,catch,异常
From: https://www.cnblogs.com/yangcurry/p/18348228

相关文章

  • 【算法】【线性表】【链表】LRU 缓存2
    1 题目请你设计并实现一个满足  LRU(最近最少使用)缓存 约束的数据结构。实现 LRUCache 类:LRUCache(intcapacity) 以 正整数 作为容量 capacity 初始化LRU缓存intget(intkey) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。voidput(......
  • 字体加粗
    字体加粗您可以通过以下CSS代码来将上述div的字体加粗:.draggable.vdr.ant-table-draggable-handle{font-weight:bold;}如果您是在Vue项目中,可以将这段代码添加到对应的.scss或.css文件中。如果是全局样式,确保正确引入该样式文件。如果是局部样式,根据组件的样......
  • 博客园自救之产品开发小建议
     继上次博客园直播方向运营建议之后,我又冒出了一个小建议, 毕竟作为博客园精神股东,开动我脑洞,我也义不容辞责任 博客园的产品形式是博客文章,拓展路径有两条,一条是文章的分类,一条的是文章的内容 分类的控制权在博客园,可拓展性强 内容的控制权在文章作者,可获站性弱 所......
  • Win10 Win11 蓝牙耳机连接笔记本电脑音量直接爆棚
    通常手机端和耳机端都有属于自己的音量,而绝对音量(AbsoluteVolume)就指的是蓝牙耳机和手机连接播放音频时双方音量同步,也就是当手机端音量调到最大时,耳机端的音量也是最大(声音加倍,快乐加倍有没有!),绝对音量也称媒体音量同步。因此可以尝试在手机端关闭绝对音量和修改注册......
  • nginx状态页面
    开启nginx状态页面安装指定模块nginx-V查看是否安装--with-http_stub_status_module模块#编译安装时添加如下参数./configure--with-http_stub_status_module配置实例server{listen80;server_name127.0.0.......
  • 一键翻译 | 分享一个更高级、更AI的翻译插件
    最近AutoGPT不是更新了嘛我也打算搭建一个来玩玩。不过呢,官方文档都是英文,阅读起来还是比较费劲的之前用的翻译插件实在难用,即卡而且翻译不准在网上找了一个新的AI翻译插件,发现贼好用,速度上很快,给大家分享一下安装安装是非常简单的网址打开:点击点击免费添加,直接安......
  • 嵌入式实时操作系统(RT-Thread、FreeRTOS、UCOSIII)
    实时操作系统(RT-Thread、FreeRTOS、UCOSIII)文章目录`实时操作系统(RT-Thread、FreeRTOS、UCOSIII)``专有名词概念``1、什么是嵌入式``嵌入式系统的特点``2、什么是实时``3、什么是操作系统``操作系统主要功能和特性``常见的操作系统类型包括``4、嵌入式实时操作系统``关......
  • C语言菜鸟入门·数据结构·链表超详细解析
     目录1. 单链表1.1 什么是单链表1.1.1  不带头节点的单链表1.1.2 带头结点的单链表1.2 单链表的插入1.2.1 按位序插入(1)带头结点(2)不带头结点1.2.2 指定结点的后插操作1.2.3 指定结点的前插操作1.3 单链表的删除1.3.1 按位序删除1.3.2 指......
  • 基于STM32F103的FreeRTOS系列(七)·任务创建·列表的使用超详细解析
    目录1. 列表和列表项1.1 列表和列表项简介1.1.1  列表1.1.2  列表项1.1.3  迷你列表项1.1.4 列表与列表项关系图1.2 列表初始化1.3 列表项的初始化1.4 列表项的插入函数1.5 列表项的末尾插入1.6 列表项的删除1.7 列表的遍历1. 列表......
  • Android SurfaceFlinger——Vsync信号发送(五十二)
           通过上一篇文章我们创建了一个EventThread线程,并且它持有了 SurfaceFlinger中resyncWithRateLimit()方法的指针。这里我们主要来看一下EventThread对信号的处理。一、发送Vsync信号        当SurfaceFlinger执行完queueBuffer()方法之后,......