异常处理 -优雅、永恒

发布于:2024-10-24 编辑:匿名 来源:网络

简介 异常处理就像穿内衣一样。戴了就不能轻易给别人看,更别说不戴了。

不然,等海浪退去,沙滩上裸奔的就是你了。异常是程序执行过程中发生的、影响程序正常流程的错误事件。

当一个方法遇到异常时,它通常会创建一个包含异常信息的对象,然后将控制权交给程序中的某个位置,该位置可以是异常处理代码或调用堆栈的其他部分。 Java中的异常处理机制是基于传统的C++异常处理机制,这迫使程序员捕获可能的异常并进行处理。

这会提高程序的可靠性,因为异常不再被忽略,而是被显式处理。异常处理的主要目标是使程序更具可读性和可维护性,因为异常处理代码通常集中在一起,而不是分散在程序的各个部分。

通过使用异常,程序员可以更轻松地理解和维护代码,因为异常处理代码与正常业务逻辑分离。在Java中,异常是在程序执行期间发生的意外情况,可能导致程序终止或产生不确定的结果。

异常分为两种类型:检查异常和非检查异常。检查异常通常表示程序无法预测的外部条件,例如文件不存在或网络连接中断。

未经检查的异常通常表示程序中的错误,例如空指针引用或数组越界。无论如何,异常提供了一种将错误处理代码与正常业务逻辑分开的方法,以确保程序的健壮性。

异常分为两类:已检查异常和未检查异常。检查异常(Checked Exceptions)是在编译时检查的,必须在代码中处理,否则程序将无法编译。

常见示例包括 IOException 和 SQLException。您可以使用 try-catch 块来捕获并处理这些异常,或者在方法签名中使用 throws 关键字来声明方法可能抛出的异常。

代码语言:javascript copy try { // 一些可能抛出异常的代码 } catch (IOException e) { // 处理 IOException } catch (SQLException e) { // 处理 SQLException } Unchecked Exceptions(未检查异常)异常 通常是由程序引起的错误并在运行时检测到。常见示例包括 NullPointerException 和 ArrayIndexOutOfBoundsException。

通常,最好通过编码和设计来避免这些异常。但如果确定无法避免,可以使用try-catch来处理。

代码语言: javascript copy try { // 一些可能会抛出异常的代码 } catch (NullPointerException e) { // 处理 NullPointerException } catch (ArrayIndexOutOfBoundsException e) { // 处理 ArrayIndexOutOfBoundsException e) { // 处理 ArrayIndexOutOfBoundsException } finally 块:无论异常是否被捕获,finally block 中的所有代码都会被执行。这通常用于确保资源的释放,例如关闭文件或网络连接。

代码语言: javascript copy try { // 一些可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 无论是否发生异常,这里的代码都会被执行 } 这是基础Java 异常处理概念。了解异常机制并适当处理异常可以帮助您编写更稳定可靠的Java代码。

Java异常类层次结构图 Java异常类层次结构图主要分为两个分支: Throwable是根类,分为两个主要子类:Error和Exception。 ThrowableError(错误)代表系统级错误,通常由虚拟机报告。

程序通常无法捕获此类错误,因为它们代表了程序无法恢复的严重问题。 OutOfMemoryError: 内存耗尽 StackOverflowError: 堆栈溢出 Exception(异常)代表程序运行过程中出现的异常情况,分为受检查异常和非受检查异常。

检查异常需要在代码中显式处理或声明可能在方法签名中引发的异常。 IOException:输入输出异常 SQLException:数据库访问异常 未检查异常(Unchecked Exceptions)通常是由程序错误引起的,不需要显式处理。

RuntimeException:运行时异常的基类 NullPointerException:空指针异常 ArrayIndexOutOfBoundsException:数组下标越界异常 ArithmeticException:算术异常 IllegalArgumentException:非法参数异常 ClassCastException:类强制转换异常等...这只是异常类层次结构的概述,实际上Java提供了众多的异常类来涵盖各种可能的异常情况。理解这种层次结构对于编写健壮的 Java 代码至关重要。

Exception关键字trytry关键字用于定义可能抛出异常的代码块。在此代码块中,您可以放置??可能引发异常的语句。

代码语言:java copy try { // 可能引发异常的代码 } catch (Exception e) { // 处理异常的代码 } finally { // 无论是否发生异常都会执行的代码 } catchcatch 关键字用于捕获并处理异常。在 catch 块中,您可以指定要捕获的异常类型并编写代码来处理异常。

代码语言:java copy try { // 可能引发异常的代码 } catch (ExceptionType e) { // 处理特定类型异常的代码 } finallyfinally 关键字用于定义一个代码块,其中的代码无论发生什么情况都会被执行是否出现异常。实施。

通常用于清理资源或确保某些代码始终执行。代码语言:java copy try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常的代码 } finally { // 无论是否发生异常都会执行的代码 } throw throw关键字用于手动抛出异常。

您可以使用它来抛出特定类型的异常对象。代码语言:java copy throw new MyException("这是一个用户异常"); throwsthrows 关键字用于声明方法签名中可能抛出的异常。

它告诉调用者可能需要处理的异常类型。代码语言: javascript copy void myMethod() throws MyException { // 方法体 } 这些关键字共同构成了Java中的异常处理机制。

通过它们,可以更好地管理和处理程序中的异常。 throw 和 throws 关键字 throw 关键字:用于手动抛出异常,即在代码中显式指定抛出异常对象。

语法:抛出异常对象;使用 throw 关键字时,在代码中显式指定抛出异常对象。这通常发生在方法内部,这意味着在某些条件下手动引发异常。

下面是一个简单的例子: 代码语言:java 复制包 com.example.demo.exception;公共类ExampleThrow { 公共静态void main(String[] args) { 尝试{ validateAge(15); } } catch (CustomException e) { System.out.println("捕获异常:" + e.getMessage()); } } static void validateAge(int Age) throws CustomException { if (age < 18) { throw new CustomException("年龄必须是 18 岁或以上"); } else { System.out.println("有效年龄:" + 年龄); } }}class CustomException 扩展了 Exception { public CustomException(String message) { super(message); }}在此示例中,validateAge 方法接受年龄参数。如果年龄小于18岁,则使用 throw 关键字手动抛出 CustomException 异常。

在main方法中,我们调用validateAge(15),由于年龄小于18,它会抛出异常,我们在catch块中捕获并处理这个异常。 throws关键字:用于在方法签名中声明可能抛出的异常类型,通常用于告诉调用者可能需要处理的异常。

语法: void myMethod() throws MyException { // 方法体 } 现在,让我们看看 throws 关键字的用法。throws 通常用于声明方法签名中可能引发的异常类型。

示例如下: 代码语言:java 复制包 com.example.demo.exception;公共类ExampleThrows { 公共静态void main(String[] args) { 尝试{ processInput(25); }处理输入(-5); } catch (CustomException e) { System.out.println("捕获异常:" + e.getMessage()); } } static void processInput(int input) throws CustomException { if (input < 0) { throw new CustomException("输入不能为负数"); } else { System.out.println("已处理的输入:" + input); } }}class CustomException 扩展了 Exception { public CustomException(String message) { super(message); }}在此示例中, processInput 方法声明它可能抛出 CustomException。在main方法中,我们调用processInput(25),由于输入是正数,所以不会抛出异常。

如果我们调用 processInput(-5),则会抛出 CustomException,因为输入为负数。总结一下: throw 用于在代码中手动抛出异常。

throws用于在方法签名中声明可能抛出的异常类型,以便调用者知道需要处理哪些异常。创建一个继承自 Exception 或其子类的自定义异常类。

可以添加构造函数,通常通过调用父类的构造函数来设置异常消息。代码语言:java copy public class CustomException extends Exception { public CustomException() { super(); } 公共 CustomException(字符串消息) { 超级(消息); }} 异常捕获try-catch示例: 代码语言:java copy public class TryCatchExample { public static void main(String[] args) { try { int result =divide(10, 0); } System.out.println("结果:" + 结果); } catch (ArithmeticException e) { System.out. println("错误:" + e.getMessage()); } } static int 除(int 分子, int 分母) { 返回分子/分母; }}解释:在try块中,我们尝试执行除法运算。

如果分母为零,则抛出 ArithmeticException。在 catch 块中,我们捕获并处理 ArithmeticException 并打印错误消息。

try-catch-finally 示例: 代码语言:java copy public class TryCatchFinallyExample { public static void main(String[] args) { try { int result =divide(10, 0); } System.out.println("结果:" + 结果); } catch (ArithmeticException e) { System.out.println("错误:" + e.getMessage()); } finally { System.out.println("这个块总是执行。"); } } static int 除(int 分子, int 分母) { 返回分子/分母; }}说明:与前面的示例类似,但有一个额外的finally 块。

无论是否发生异常,finally 块中的代码都会执行。这在您需要确保释放或清理资源的情况下非常有用。

try-finally 示例: 代码语言:java copy public class TryFinallyExample { public static void main(String[] args) { try { // 一些可能抛出异常的代码 } finally { System.out.println("这个块总是执行 . ”); } }}说明:此示例没有 catch 块,只有 try 块和 finally 块。无论是否发生异常,finally 块中的代码都会执行。

这在您只关心资源清理而不关心异常处理的情况下非常有用。try-with-resources try-with-resources是Java 7中引入的语法糖,用于更方便地管理资源,例如文件、网络连接等,而无需在代码中显式添加资源关闭语句。

此语法确保在 try 块末尾,括号内声明的所有资源都被关闭,即使 try 块内发生异常也是如此。示例: 代码语言: javascript copy package com.example.demo.exception;import java.io.FileReader;import java.io.BufferedReader;import java.io.IOException;public class TryWithResourcesExample { public static void main(String[] args ) { // 使用 try-with-resources 读取文件内容 try (FileReader fileReader = new FileReader("E:\\example.txt"); BufferedReader bufferedReader = new BufferedReader(fileReader)) { String line; } // 逐行读取文件内容 while ((line = bufferedReader.readLine()) != null) { System.out.println("从文件中读取: " + line); } } catch (IOException e) { System.out.println( "读取文件时出错:" + e.getMessage()); } }}在此示例中,我们使用 try-with-resources 来读取文件内容。

FileReader 和 BufferedReader 是实现 AutoCloseable 接口的资源。这两个资源在try括号内声明,不需要手动关闭,它们会在try块末尾自动关闭。

注意:资源必须实现 AutoCloseable 或 Closeable 接口。当try-with-resources语句结束时,资源会按照声明的相反顺序关闭,即先声明的资源先关闭。

资源以与声明相反的顺序关闭,因为稍后声明的资源可能依赖于较早声明的资源。异常的主要观点及异常基本概念总结: 异常是程序运行中出现的问题,可能导致程序无法继续正常执行。

异常分为两类:Error 和 Exception。其中,Error代表严重的问题,通常是不可恢复的,而Exception代表可以捕获并处理的问题。

异常处理的优点:异常处理提供了一种机制,允许程序员在异常发生时采取特定的操作,而不是简单地让程序崩溃。异常处理使得程序更加健壮,能够更好地适应和响应各种运行时问题。

捕获并处理异常:使用 try-catch 块捕获并处理异常,防止它们传播到程序的上层。正确选择捕获和处理异常可以使程序更易于调试和维护。

异常层次结构:异常类之间形成层次结构,允许程序员根据特定的异常类型来捕获和处理异常。异常的层次结构有助于更精细地处理不同类型的异常。

finally块的作用:无论是否发生异常,finally块中的代码都会被执行。 finally 块通常用于确保资源的释放或清理。

自定义异常:程序员可以根据需要创建自定义异常类,使异常信息更加具体和有意义。自定义异常有助于更好地反映程序的逻辑结构和错误情况。

关于异常和错误处理的哲学观点:程序员应该在可以合理处理的地方捕获并处理异常,而不是简单地忽略或直接传播异常。异常处理应该是程序设计的一部分,而不仅仅是错误响应机制。

常见异常类 Checked Exceptions IOException:描述输入输出操作中可能出现的问题,如文件不存在、无法读写等。 FileNotFoundException:继承自 IOException,表示试图访问某个文件但该文件不存在。

ParseException:描述解析操作可能出现的问题,通常与日期和时间解析有关。ClassNotFoundException:描述尝试加载类时找不到类的情况。

SQLException:描述与数据库相关的问题,例如连接失败、SQL语句执行错误等。 :InterruptedException:描述一个线程在等待对象上的锁时被其他线程中断。

FileNotFoundException:继承自IOException,表示尝试访问文件但该文件不存在。 ParseException:描述解析操作可能出现的问题,通常与日期和时间解析有关。

ClassNotFoundException:描述尝试加载类时找不到类的情况。未经检查的异常 NullPointerException:当尝试访问其属性或调用方法时,该对象为 null。

ArrayIndexOutOfBoundsException:尝试访问超出范围的数组索引。 ArithmeticException:执行数学运算(例如除以零)时发生错误。

IllegalArgumentException:该方法接收到非法参数。 IllegalStateException:对象处于不正确的状态。

NumberFormatException:将字符串转换为数字时,字符串格式不正确。 ClassCastException:尝试将对象转换为其子类,但实际对象类型不允许此类转换。

NullPointerException:尝试调用空对象的方法或访问属性。除了未检查的异常和检查的异常之外,Java还包括一些其他类型的异常。

这些异常通常是 Error 类的子类,代表更严重且通常无法恢复的问题。以下是其他一些常见异常: 错误异常 OutOfMemoryError:当 Java 虚拟机耗尽内存资源而无法继续分配时,抛出此错误。

StackOverflowError:当由于递归调用或方法调用层次太深而导致堆栈空间不足时,会抛出此错误。 NoClassDefFoundError:当Java虚拟机尝试加载类但找不到该类的定义时,会抛出此错误。

LinkageError:当类的链接过程失败时抛出此错误。例如,虚拟机找到了类的定义,但找不到该类的父类。

AssertionError:当断言语句(assert)失败时抛出此错误。通常在开发和调试阶段使用。

ExceptionInInitializerError:类的初始化过程中发生异常时抛出此错误。通常异常发生在类的静态初始化块中。

我正在参加腾讯科技创造特训营第四期有奖征文比赛。

异常处理 -优雅、永恒

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • FLYPRO飞豹携XEagle无人机 亮相2016全球最大无人机展AUVSI XPONENTIAL

    FLYPRO飞豹携XEagle无人机 亮相2016全球最大无人机展AUVSI XPONENTIAL

    FLYPRO飞豹携旗下XEagle无人机亮相2016年全球最大无人机展AUVSI - 5日在美国路易斯安那州新奥尔良举行,XPONENTIAL是全球规模最大、最专业的无人机展,也是机器人领域首屈一指的全球顶级专业盛会技术市场,吸引了全球众多行业领先企业的参与。 (FLYPRO无人机展位)作为全球智

    06-18

  • 赛维尔生物科技获数千万元A轮融资

    赛维尔生物科技获数千万元A轮融资

    投资圈(微信ID:pedaily)据7月3日消息,武汉赛维尔生物科技有限公司近日获得来自投资界的数千万元A轮融资天堂硅谷集团旗下基金独家投资,本轮融资将用于加速公司的产品研发和市场拓展。 资料显示,赛维尔生物成立于2007年,总部位于光谷生物城生物医药园。 是一家实验服务和

    06-17

  • 青岛高新区工委委员、管委副主任张建军一行到访合肥启迪科技城

    青岛高新区工委委员、管委副主任张建军一行到访合肥启迪科技城

    青岛高新区工委委员、管委会副主任张建军一行莅临合肥启迪科技园青岛高新区微信ID gh_ecda6b45ee21关于专题启迪之星(青岛高新区)由青岛高新区与青岛高新区共同打造启迪控股东北亚总部。 围绕青岛高新区特色产业集群需求,帮助青岛高校师生创新创业和科技成果转化。 创建有影

    06-17

  • 英飞凌:在华新投资扩建无锡生产线

    英飞凌:在华新投资扩建无锡生产线

    11月6日,德国半导体科技公司英飞凌在第三届中国国际进口博览会上公布了在华最新投资计划。 公司决定扩建无锡生产线工厂的IGBT模块生产线。 IGBT是指绝缘栅双极型晶体管。 具有高频、高电压、大电流、易开关等优良特性。 它是能量转换和传输的核心装置。 被业界誉为功率变换器

    06-06

  • MOOVED完成数千万元Pre-A轮融资,打造非洲本土家电品牌

    MOOVED完成数千万元Pre-A轮融资,打造非洲本土家电品牌

    投资界(ID:pedaily)据5月5日消息,非洲家电企业MOOVED近期完成数千万元融资人民币Pre-A轮融资。 本轮融资由普尔曼资本领投。 本轮新募集资金将用于产品研发、中国和非洲市场人才团队扩充以及品牌投资和线下渠道拓展。 据悉,MOOVED今年4月完成天使轮融资。 “MOOVED成立于

    06-18

  • 通信芯片设计商纽瑞芯完成天使轮融资

    通信芯片设计商纽瑞芯完成天使轮融资

    据投资界2月28日消息,通信芯片设计商深圳纽瑞芯科技有限公司(以下简称“纽瑞芯”)宣布成功完成天使轮融资。 本轮融资由新云创投领投,资金将主要用于公司射频和模拟混合芯片技术平台的研发和迭代,以及5G和5G两大关键技术的产业化。 物联网通信定位芯片、5G射频天线智能调

    06-18

  • 贺利氏电化(上海)有限公司新电子化学品项目奠基

    贺利氏电化(上海)有限公司新电子化学品项目奠基

    据上海化学工业区官方微信公众号消息,贺利氏电化(上海)有限公司新电子化学品项目奠基仪式隆重举行。 “新型电子化学品项目”在上海化学工业区召开。 贺利氏电子化学材料事业部全球联席总裁Bernd Stenger表示,新项目的实施体现了贺利氏坚定的“在中国,为中国”的战略。

    06-06

  • 易居与克而瑞达成合并协议,收购价格提升至每股1.75美元

    易居与克而瑞达成合并协议,收购价格提升至每股1.75美元

    易居(中国)控股有限公司与中国房地产信贷有限公司达成合并协议计划收购全部流通股北京时间12月28日消息,易居(中国)控股有限公司当天宣布,与中国房地产信息公司达成合并协议及方案。 集团与中国房地产信息(中国)控股有限公司。 根据合并协议,易居将收购中房信贷全部流

    06-18

  • 科沃斯Smart Move技术产品亮相广州

    科沃斯Smart Move技术产品亮相广州

    科沃斯智动科技产品在广州亮相 2020年3月17日,科沃斯扫地机器人地宝9系列媒体品鉴会在广州贝塔咖啡举行。 科沃斯讲解了其Smart Navi全局规划技术,并现场展示了搭载该技术的DR95扫地机器人。 这项技术开发了机器人的视觉,让机器人能够自主检测和记忆环境,构建地图,先规划

    06-17

  • 特斯拉应该像他一样,监督司机在自动驾驶时的行为

    特斯拉应该像他一样,监督司机在自动驾驶时的行为

    上周五,特斯拉的电动车在自动驾驶模式下遭遇车祸,引起了全世界的关注。 特斯拉随后官方宣布,这个自动驾驶功能并不能完全控制汽车。 驾驶员必须用手握住方向盘并保持警惕并与汽车系统进行交互。 这一事件再次提醒世人关注当前无人驾驶汽车的安全问题。 目前,无人驾驶技术

    06-18

  • 商汤科技上市首日股价大涨7.27%,总市值近1400亿港元

    商汤科技上市首日股价大涨7.27%,总市值近1400亿港元

    上头条几经波折,12月30日,国内人工智能巨头商汤集团有限公司上市。 (.HK)终于在香港联交所上市。 首日收盘价为4.13港元,较发行价上涨7.27%。 商汤科技总市值为1亿港元。 同日,商汤在上海和香港同时举行上市庆祝仪式。 仪式期间,商汤特地利用AR技术创新打造了“AR敲锣”

    06-18

  • 挚文集团2022年Q4净营收32.127亿元,净利润4.879亿元

    挚文集团2022年Q4净营收32.127亿元,净利润4.879亿元

    北京时间3月16日,挚文集团(纳斯达克股票代码:MOMO)公布未经审计的第四季度及全年财务业绩。 财报显示,今年第四季度,挚文集团净营收达到32亿元人民币(约合4亿美元)。 不按照美国通用会计准则计算,归属于挚文集团的净利润为4亿元人民币(约合1万美元)。 ; 。 据彭博社

    06-17