Java异常浅析一二

1.异常处理Exception类及它的子类 C# 异常处理,一般使用try、catch、finally和throw等关键词,捕获和处理异常(特别说明,finally块 执行给定的语句,不管异常是否被抛出都会执行) 异常处理也是 AOP常用的实现,即面向切面编程设计思想 Exception类的子类 主要有两个System.ApplicationException和System.SystemException类。 System.ApplicationException:支持由应用程序生成的异常。一般我们开发定义的异常都应派生自该类 Sy... 阅读详情

Java异常

Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。

1. 异常类层次图

Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。 Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
在这里插入图片描述

1.1 Throwable

Throwable 是 Java 语言中所有错误与异常的超类。

1.2 Error

Error 类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。

1.3 Exception

Exception 这种异常又分为两类:运行时异常和编译时异常。

1.3.1 RuntimeException 运行时异常

运行时异常的特点是Java编译器不会检查它,也会编译通过。
NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

1.3.2 CheckedException 可检查的异常

其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

2. 异常处理关键字

2.1 throws

用在方法签名中,用于声明该方法可能抛出的异常。当方法的调用者无力处理该异常的时候,应该抛出异常交由上级调用者处理。

若是父类的方法没有声明异常,则子类继承方法后,也不能声明异常。
若方法中存在检查异常,如果不对其捕获,那必须在方法头中显式声明该异常。

public static void method() throws IOException, FileNotFoundException{

2.2 throw

用于抛出异常。因为Java的大部分方法要么已经处理异常,要么已声明异常。所以一般都是捕获异常或者再往上抛,不需要手工throw。

	if(value == 0) {
        throw new ArithmeticException("参数不能为0"); //抛出一个运行时异常
    }

throw的目的常常是为了改变异常的类型。多用于在多系统集成时,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。

	catch (IOException e) {
        MyException ex = new MyException("read file failed.");
        ex.initCause(e);
        throw ex;
    }

异常可以自定义

public class MyException extends Exception {
    public MyException(){ }
    public MyException(String msg){
        super(msg);
    }
}

3 try catch finally

try , 监听代码,在try语句块之内,当try语句块内发生异常时,异常就被抛出。 catch, 用于捕获异常。catch用来捕获try语句块中发生的异常。 finally , finally语句块总是会被执行。它主要用于回收在try块里打开的资源。只有finally块执行完成之后才会回来执行try或者catch块中的return或者throw语句;如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
常用的组合方法有

3.1 try-catch

可以捕获多个异常,但要注意异常类的层次,要先捕获子类异常。

static void readFile(String fileName) {
    try {
        // dosomething()
    } catch (FileNotFoundException | UnknownHostException e) {
        // handle FileNotFoundException
    } catch (IOException e){
        // handle IOException
    }
}

3.2 try-catch-finally

如果没有异常发生,代码执行顺序是:try代码块==>finally代码块;
如果异常发生,但是catch的异常不包含此类异常,则finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行。
结构如下:

try {                        
    //执行程序代码,可能会出现异常                 
} catch(Exception e) {   
    //捕获异常并处理   
} finally {
    //必执行的代码
}

3.3 try-finally

try-finally可用在不需要捕获异常的代码,可以保证资源在使用后被关闭。例如IO流中执行完相应操作后,关闭相应资源;使用Lock对象保证线程同步,通过finally可以保证锁会被释放;数据库连接代码时,关闭连接操作等等。如:

//以Lock加锁为例,演示try-finally
ReentrantLock lock = new ReentrantLock();
try {
    //需要加锁的代码
} finally {
    lock.unlock(); //保证锁一定被释放
}

3.4 try-with-resource

try-with-resource是Java 7中引入的,提供了更优雅的方式来实现资源的自动释放,自动释放的资源需要是实现了 AutoCloseable 接口的类

private  static void tryWithResourceTest(){
    try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
        // code
    } catch (IOException e){
        // handle exception
    }
}

查看源码Scanner实现了Closeable 接口。

public final class Scanner implements Iterator<String>, Closeable {
  // ...
}

4. try catch finally 与 return

先说结论:
如果try里没有出错,优先finally的return。
如果在try里出错,还是优先finally的return。如果没有finally块,才是catch块里return。

如果在finally里变更值的指向,对于基本类型和引用类型都不会生效。
但如果调用可变对象的更改方法,则会生效。

所以,最好不要在finally块里加上return或者对变量重新赋值或设置,因为比较容易弄混淆,导致代码不可读。

public class Test01 {

    static int m1(){
        try{
            int a =1/0;
            return 1;
        }
        catch (Exception e) {
            return 2;
        }
    }

    static int m2(){
        try{
            int a =1/0;
            return 1;
        }
        catch (Exception e){
            return 2;
        }
        finally {
            return 3;
        }
    }

    static int m3(){
        try{
            return 1;
        }
        finally {
            return 2;
        }
    }

    static int m4(){
        int result = 0;
        try{
            return result;
        }
        finally {
            result = 1;
        }
    }

    static StringBuilder m5(){
        StringBuilder result = new StringBuilder("ab");
        try{
            return result;
        }
        finally {
            result.append("aaaa");
        }
    }

    static StringBuilder m6(){
        StringBuilder result = new StringBuilder("ab");
        try{
            return result;
        }
        finally {
            result = new StringBuilder("bbb");
        }
    }

    public static void main(String[] args) {
        System.out.println("Test01.m1():"+Test01.m1());
        System.out.println("Test01.m2():"+Test01.m2());
        System.out.println("Test01.m3():"+Test01.m3());
        System.out.println("Test01.m4():"+Test01.m4());
        System.out.println("Test01.m5():"+Test01.m5());
        System.out.println("Test01.m6():"+Test01.m6());
    }
}

运行结果:

Test01.m1():2
Test01.m2():3
Test01.m3():2
Test01.m4():0
Test01.m5():abaaaa
Test01.m6():ab

5. 异常处理原则

5.1 只针对不正常的情况才使用异常

比如文本转换字符串时,不应该使用异常来实现,代价昂贵。

5.2 清理工作回收资源放在finally块中

finally 代码块总是会被执行,你可以确保你清理了所有打开的资源。或者使用try-with-resource 语法

5.3 优先捕获最具体的异常

总是优先捕获最具体的异常类,并将不太具体的 catch 块添加到列表的末尾。

5.4 不要捕获Throwable

如果catch Throwable ,它不仅会捕获所有异常,也将捕获所有的错误。对于JVM 错误,应该由应用程序处理。

5.5 不要忽略异常

捕获异常后不应当不做任何处理。

5.6 包装异常后抛出

捕获标准异常并包装为自定义异常是一个很常见的做法。
throw new MyBusinessException("error message.", e);

5.7 不要使用异常控制程序的流程

本应该使用if语句进行条件判断的情况下,你却使用异常处理,这是非常不好的习惯

5.8 不要在finally块中使用return

try块中的return语句执行成功后,并不马上返回,而是继续执行finally块中的语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。

5.9 尽可能使用标准异常

在语义符合的情况下,尽量重用java标准异常。

IllegalArgumentException 参数的值不合适
IllegalStateException 参数的状态不合适
NullPointerException 在null被禁止的情况下参数值为null
IndexOutOfBoundsException 下标越界
ConcurrentModificationException 在禁止并发修改的情况下,对象检测到并发修改
UnsupportedOperationException 对象不支持客户请求的方法

6.常见异常种类

6.1 RuntimeException

java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。
java.lang.ArithmeticException 算术条件异常
java.lang.NullPointerException 空指针异常。
java.lang.ClassNotFoundException 找不到类异常。当应用试图遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。 java.lang.NegativeArraySizeException 数组长度为负异常
java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
java.lang.SecurityException 安全性异常
java.lang.IllegalArgumentException 非法参数异常

6.2 IOException

IOException IOException:操作输入流和输出流时可能出现的异常。
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常

6.3 其他

ClassCastException 类型转换异常类
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时.

7.JVM处理异常的机制

7.1 异常表

JVM处理异常的机制,在字节码层面使用了异常表。异常表中包含了一个或多个异常处理者(Exception Handler)的信息,这些信息包含如下 from 可能发生异常的起始点 to 可能发生异常的结束点 target 上述from和to之前发生异常后的异常处理者的位置 type 异常处理者处理的异常的类信息

7.2 异常处理极其耗时

建立一个异常对象,是建立一个普通Object耗时的约20倍(实际上差距会比这个数字更大一些,因为循环也占用了时间,追求精确的读者可以再测一下空循环的耗时然后在对比前减掉这部分),而抛出、接住一个异常对象,所花费时间大约是建立异常对象的4倍。

总结

合理的处理异常,是程序健壮性的保证。

java基础 系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/javabasic
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

Java异常 Throwable、Exception、Error   异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。   Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。 Throwable https://images0.cnblogs.com/blog2015/521294/201505/170149357047799.jpg 在 Java 中,所有的异常都有一个共同的祖先 T... 阅读详情

相关推荐

Java 异常及处理|Error、Throwable、Exception

Java 异常及处理|Error、Throwable、Exception

weixin_40772077的博客 2424

JAVA 异常Exception讲解

Excetion精讲,不懂得来看!!

weixin_65728526的博客 9154

Java 异常处理 -- Java 语言的异常、异常链与断言

世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确处理好意外情况,才能保证程序的可靠性。

栗筝i的博客 5211

Java—异常(Exception)

基本概念 Java语言中,将程序执行中发生的不正常情况称为“ 异常 ”。(开发过程中的语法错误和逻辑错误不是异常) 执行过程中所发生的异常事件可分为两大类 1.Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out of memory),Error是严重错误,程序会崩溃 2.Exception:其它因编译错误和偶然的外在因素导致的一般性问题,可以使用针对性的代码......

weixin_61843013的博客 5732

浅析Java中两种抛出异常的方法

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。 在Java中有两种抛出异常的方式,一种是throw,直接抛出异常,另一种是throws,间接抛出异常。 直接抛出异常是在方法中用关键字throw引发明确的异常。当throw被执行时,其后语句将不再执行,执行流程将直接寻找catch语句并进行匹配。这种错误不是出错产生,而是人为...

算法与编程之美 2587

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3084

Java异常浅析及常见异常

Java异常浅析及常见异常Java异常结构ErrorException常见异常 Java异常结构 在Java语言中,程序执行中发生的不正常情况被称为异常;所有的异常都会继承Throwable接口,而Throwable下一层又分为两类,分别是Error和Exception。 Error Error描述的是Java程序运行时系统内部的错误,通常会比较严重,程序只会被安全地终止,应用程序一般不会去捕获这种异常,通常为虚拟机异常,例如StackOverflowError和OOM。 Exception Except

fucccck_ly的博客 312

微信4.1.5.16升级后,你的自动化脚本失灵了?手把手教你用C#让UI树“复活”

微信4.1.5.16版本更新导致自动化脚本失效?本文深入解析微信UI树隐藏的原因,并提供C#实战解决方案,通过UIAutomation技术恢复UI树结构,帮助开发者重新实现自动化操作。涵盖技术原理、代码实现及优化策略,适合RPA开发者和自动化脚本编写者参考。

weixin_30879169的博客 519

java异常浅析

Java异常浅析 try catch try catch finnaly 运行时异常 编译时异常 throw与throws区别

m0_51765966的博客 758

基于Transformers库的BERT模型:一个文本情感分类的实例解析

简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数...

蓝天白云梦的csdn博客 2万+

4路QSFP28接口能玩出什么花样?基于璞致VU13P开发板的100G网络测试方案

本文详细介绍了基于璞致PZ-VU13P-KFB开发板构建100G网络测试方案的实战指南。该方案充分利用板载Xilinx Virtex UltraScale+ FPGA的强大算力与4路QSFP28接口,涵盖从光模块选型、Aurora协议配置、开源Corundum方案部署,到误码率测试及散热优化的全链路流程,为高速网络设备研发与验证提供了可靠的硬件平台。

cola5的博客 454

Java 异常机制浅析

文章目录处理错误异常分类声明受查异常如何抛出异常创建异常类捕获异常捕获异常再次抛出异常和异常链finally 字句带资源的 try 语句分析堆栈轨迹元素使用异常机制的技巧使用断言启用和禁用断言使用断言完成代码检查记录日志关于异常的补充知识链接 处理错误 异常分类 所有的异常都是继承于 Throwable graph LR Error--&gt;Throwable Exception--&gt;Th...

Strange_Monkey的博客 735

硬件单板类机考复习提纲

6、 功率晶体管低导通损耗时处于的状态(饱和状态、放大状态、截止状态)(放大器的采样频率特性)总结:元器件特性(电阻、电容、二极管、三极管、晶体、晶振、MOS、磁珠等)信号质量问题产生根因(单调性、边沿过缓、毛刺、回沟、抖动等)3、 几种电容容量范围大小(超级电容、钽电容、陶瓷电容、铝电容)66、背板连接器接触设计的接触顺序(先导向、再地针、最后信号针)28、逻辑电平接口的特性(CMOS、TTL、ECL、PECL)76、差分电平(lvpecl、RS-422/485、cml)

2303_79562407的博客 1万+

浅析Java异常处理

浅析Java异常处理 文章目录浅析Java异常处理1.异常2.分类:2.1依据类关系区分2.2 checked、unchecked异常3.异常处理机制3.1捕获异常3.2抛出异常4.自定义异常类 1.异常 异常指不期而至的各种状况,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序的正常执行。一旦产生异常,异常之后的语句并不会被执行,而是直接结束程序,并将错误报告给客户了。 Java异常类层次结构图:

struct_hsj的博客 319

【光子AI 2026 企业级 Agent 架构指南】别再把 Skill 当 Tool:Agent Skills × MCP 企业级落地全指南(最新定义澄清 + 场景大全 + 选型决策树+安全工程清单)

摘要: 2026年企业级AI架构迎来两大核心标准——Agent Skills与MCP(Model Context Protocol),分别解决流程标准化与系统集成难题。Agent Skills通过“文件夹化能力包”(SOP+脚本+模板)固化专家流程,确保输出一致性;MCP则以类USB-C的协议统一外部系统接入,降低集成成本。两者差异显著:Skills专注程序性知识(如财报生成),MCP侧重动态连接(如跨平台数据调用)。实际场景中,复杂需求(如智能客服)需组合使用——MCP为骨架提供连接能力,Skills为大

AI天才研究院 2473

SAP BOM批量反查代码分享

SAP BOM反查批量查询代码分享

我小时候很黑的博客 4972

Java之异常浅析

在java中,程序运行时可能会遇到特殊的情况,导致程序出错,将这些 “特殊情况” 称之为为java异常体系。异常是一种例外,程序在执行期间发生的事件,它中断正在执行程序的正常指令流。在开发过程中,很多情况都会导致异常的发生,如分母为负数,数组下标越界等。...

ldcaws的专栏 316

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 544

Java泛型浅析一二

泛型是一种参数化类型的机制。它可以使得代码适用于各种类型,从而编写更加通用的代码,例如集合框架。 泛型是一种编译时类型确认机制。它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时异常。

EndlessProcess的专栏 724

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java的异常处理机制浅析

Java的异常处理机制浅析部分学习了java中的异常处理,在这里就所学说说自己对异常处理机制的理解,同时还可加深记忆。说到异常就不会不知道错误,但对于Java来说,错误运行时是无法改变的,一旦发生程序就会立即终止。索性Java也不深究,对于Java编程意义不大。但是异常和错误相反,它是可以被修改和处理的,而且为了程序的正常运行是必须处理的。说到异常和错误的联系,那就先说说他们的父类以及继承关系吧。异

识海 423

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

浅析java异常处理机制——理论篇

前言try…catch…finally恐怕是大家再熟悉不过的语句了,刚接触的时候感觉用起来也是很简单,逻辑上似乎也是很容易理解。可是随着我们学习和理解的深入,发现这个东西并没有想象中的那么简单。异常处理往往是我们编程时必须时时注意和不得不解决的问题。而我们写程序的时候往往只是被硬性的要求必须写try…catch,必须对异常处理,可是如何处理才合理,如何处理才能让系统更完善考虑的很少。我们对它缺少一个

区块链领域填坑的java程序猿 1654

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java异常处理浅析

什么是异常? 异常就是当程序运行时,发生了不在计划内的事件,影响了程序的正常运行,这就是异常. 什么是异常处理? Java提供了更加优秀的解决办法:异常处理机制。 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,...

weixin_45016177的博客 131

Java异常浅析理解

什么是异常? java中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,中断正在执行程序的正常指令流。有效地处理程序中的运行错误,使用异常类。 异常的分类

weixin_67573348的博客 468

JAVA异常处理原理浅析

一,异常的分类 1、Throwable是java.lang包中一个专门用来处理异常的类。它有两个子类,即Error 和Exception,它们分别用来处理两组异常。 2、Throwable类是整个异常体系类的“父级类”,当然最终追根溯源到底的父类当然要归于Object类。 Throwable类实现了Serializable接口,表示Throwable可以进行序列化,继承自Obj...

aikui8441的博客 257

java的异常思维导图,Java学习之异常浅析

异常思维导图java异常处理.png一、异常的种类检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。运行时异常(非检查异常): 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢...

weixin_39928003的博客 207
上一篇: Java注解浅析一二
下一篇: Java反射浅析一二
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值