Java-Exception

目录

    • 异常
    • 概念
      • Error
      • Exception
    • 体系图
    • 常见运行时异常
      • NullPointerException
      • ArithmeticException
      • ArrayIndexOutOfBoundException
      • ClassCastException
      • NumberFormatException
    • 常见的编译异常
    • 异常处理机制
    • 自定义异常
    • throw和throws对比

异常是Java编程中的常见问题,了解如何处理异常至关重要。本文将介绍Java中异常的基本概念,以及如何捕获和处理它们,以构建健壮的应用程序。

异常

异常是在程序运行过程中发生的错误或意外情况,它可以中断正常的程序流程并引发错误处理机制。

Code

// 尝试执行可能引发异常的代码
public void divide(){int num1=10;int nums2=0;			int result = num1 / num2;   // 10/0 直接抛出异常
}

但是在真实的业务中,如果因为一个异常导致整个程序无法继续进行,说明这个程序的健壮性很差,

为了保证程序能够进行,可以使用trye-catch异常处理机制来解决

Code

public void divide(){try {int num1=10;int nums2=0;			int result = num1 / num2;   // 10/0 直接抛出异常} catch (ArithmeticException e) {// 捕捉并处理异常System.err.println("发生了算术异常:" + e.getMessage());} // 无论是否发生异常,都会执行的代码块System.out.println("程序执行结束");
}

如果进程异常处理,那么即使程序出现了异常,程序也可以继续进行。

概念

将程序执行中发生不正常的情况成为“异常”(开发过程中出现的语法错误等不是异常)

在执行过程中所发生的异常可以分为两大类:

Error

Jvm无法解决的严重问题,如:

  1. JVM系统内部出现错误、资源消耗
  2. StackOverFlow(栈溢出)、OOM(out of memory)等严重错误

Exception

Exception可以分为

  1. 运行时异常:程序运行过程中,发生异常(空指针、读取不到文件等)
  2. 编程时异常:编译器检测出来的异常

体系图

Untitled.png

常见运行时异常

NullPointerException

空指针异常,通常在尝试访问或操作尚未初始化或已设置为**null**的对象时发生。

Code

String myString = null;
System.out.println(myString.length()); // 这将引发NullPointerException

ArithmeticException

算数异常,它在进行算术运算(例如除以零)产生无效结果时发生。

Code:

int result = 5 / 0; // 这将引发ArithmeticException(算术异常)

这段代码中,尝试5除以0,从数学上来说是未定义计算公式,因此会引发ArithmeticException异常。

ArrayIndexOutOfBoundException

数组索引越界异常,通常在访问数组中不存在的索引位置而抛出。

Code

int nums={1,2,3,4};
int value=nums[10];   

数组nums有5个元素,索引范围是0~4,但是我们试图访问索引10的元素,这个索引超出了数组的最大范围,

因此抛出ArrayIndexOutOfBoundException异常。

ClassCastException

类型转换异常,通常在一种类型转为不兼容的类型时抛出。

Code

class Animal {// ...
}class Dog extends Animal {// ...
}class Cat extends Animal {// ...
}public class Main {public static void main(String[] args) {Animal animal = new Dog();Cat cat = (Cat) animal; // 这将引发ClassCastException(类转换异常)}
}

创建了Animal类和两个子类Dog、Cat,我们试图将Dog对象的引用转为Cat类型,这是一种不兼容的类型,

因此抛出ClassCastException异常。

NumberFormatException

数字格式异常,通常在字符串转为数字类型时发生格式错误时抛出

Code

String invalidNumber = "abc123";
int number = Integer.parseInt(invalidNumber); // 这将引发NumberFormatException(数字格式异常)

我们试图将包含字母字符的字符串"abc123" 转换为整数,这是不合法的数字格式,

因此会引发NumberFormatException(数字格式异常)。

常见的编译异常

  1. SQLException:(SQL异常)它表示在执行SQL语句或与数据库交互的过程中发生了问题或错误。
  2. IOException:(输入/输出异常)它表示在读取或写入文件、网络操作或其他I/O相关操作期间发生了问题或错误。
  3. FileNotFoundException:(文件未找到异常)FileNotFoundExceptionIOException的一种子类,表示尝试打开或读取一个不存在的文件时引发的异常。
  4. ClassNotFoundException:(类未找到异常)表示在尝试加载类时找不到类定义的情况

异常处理机制

在Java中,异常处理是通过一系列的关键字和机制来实现的。

  1. try-catch块:使用 try 和 catch 关键字来捕获和处理异常。异常可能会在 try 块中的代码中抛出,而 catch 块则用于捕获异常并执行相应的处理代码。

    try {// 可能会引发异常的代码
    } catch (ExceptionType e) {// 处理异常的代码
    }
    
  2. 多重catch两块:一个try块可以有多个catch块,用于捕获不同类型的异常,这样可以根据不同的类型异常执行不同的逻辑。

    try {// 可能会引发异常的代码
    } catch (ExceptionType1 e1) {// 处理 ExceptionType1 类型的异常
    } catch (ExceptionType2 e2) {// 处理 ExceptionType2 类型的异常
    }
    
  3. finally块:finally块用于包含try-catch块之后,它包含的代码无论是否发生异常都会执行。

    try {// 可能会引发异常的代码
    } catch (ExceptionType e) {// 处理异常的代码
    } finally {// 无论是否发生异常都会执行的代码
    }
    
  4. throws关键字:throw关键字可以用于在方法中主动引发异常,并不能像try-catch块一样有处理异常的逻辑,通常用于自定义异常或在特定条件下引发异常。

    public void someMethod() throws ExceptionType {// 可能会引发异常的代码
    }
    

自定义异常

当程序中出现了某些“错误”,但该类错误信息并没有在Throwable子类中描述处理,这个时候可以自定义异常类,用于描述该错误信息

自定义异常步骤

  1. 自定义异常类;如果继承Exception,属于编译类型异常;如果继承RuntimeException,属于运行时异常(通过继承RuntimeException)

    public class MyCustomException extends Exception {public MyCustomException() {super();}public MyCustomException(String message) {super(message);}public MyCustomException(String message, Throwable cause) {super(message, cause);}
    }
    

    通过自定义异常类提供多个构造函数,以便能够传递异常消息和可能的原因(Throwable)。这样可以让您的异常提供更多信息,以便于调试和理解问题。

  2. 使用自定义类异常,在代码中如果符合自定义异常的条件时,使用throw关键字抛出自定义异常;

    public void someMethod() throws MyCustomException {// 某些条件导致自定义异常情况if (someCondition) {throw new MyCustomException("自定义异常消息");}// 其他代码
    }
    
  3. 捕获和处理自定义异常:在应用程序的其他部分,也可以使用 try-catch 块来捕获和处理自定义异常

    try {someMethod();
    } catch (MyCustomException e) {// 处理自定义异常System.out.println("捕获自定义异常:" + e.getMessage());
    }
    

throw和throws对比

意义位置后面根的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象
  1. throw:在代码中显示地抛出异常对象,用于指定条件下的异常,throw 后面通常跟着一个异常对象的实例化或引用;

    public void someMethod() {if (someCondition) {throw new SomeException("Custom error message");}
    }
    
  2. throws:用于在方法声明中指定该方法可能会抛出的异常类型。

public void someMethod() throws ExceptionType {// 可能会引发异常的代码
}

通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java异常的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/97157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nsoftware Cloud SMS 2022 .NET 22.0.8 Crack

nsoftware Cloud SMS 能够通过各种流行的消息服务(包括 Twilio、Sinch、SMSGlobal、SMS.to、Vonage、Clickatell 等)发送、接收和安排 SMS 消息,从而提供了一种简化且高效的消息服务方法。 Cloud SMS 提供单个 SMS 组件,允许通过…

JDBC-day02(使用PreparedStatement实现CRUD操作)

所需的数据库数据要导入到自己的数据库库中 三:使用PreparedStatement实现CRUD操作 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。其实一个数据库连接就是一个Socket连接。CRUD操作:根据返回值的有无…

【Go】go-es统计接口被刷数和ip访问来源

go-es模块统计日志中接口被刷数和ip访问来源 以下是使用go的web框架gin作为后端,展示的统计页面 背景 上面的数据来自elk日志统计。因为elk通过kibana进行展示,但是kibana有一定学习成本且不太能满足定制化的需求,所以考虑用编程的方式…

Eclipse iceoryx™ - 真正的零拷贝进程间通信

1 序言 通过一个快速的背景教程,介绍项目范围和安装所需的所有内容以及第一个运行示例。 首先:什么是冰羚? iceoryx是一个用于各种操作系统的进程间通信(IPC)中间件(目前我们支持Linux、macOS、QNX、FreeBS…

C语言中文网 - Shell脚本 - 1

Shell 既是一个连接用户和 Linux 内核的程序,又是一门管理 Linux 系统的脚本语言。Shell 脚本虽然没有 C、Python、Java、C# 等编程语言强大,但也支持了基本的编程元素。 第1章 Shell基础(开胃菜) 欢迎来到 Linux Shell 的世界&am…

asp.net闲置物品购物网系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net闲置物品购物网系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语 言开发 asp.net 闲置物品购物网 二、功…

JavaScript中的map()和forEach()方法有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

DevEco Studio下载/安装与配置开发环境

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 1.进入DevEco Studio下载官网 单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和Mac…

学信息系统项目管理师第4版系列20_风险管理

1. 针对不确定性的应对方法 1.1. 【高23上选58】 1.2. 收集信息 1.2.1. 可以对信息收集和分析工作进行规划,以便发现更多信息(如进行研究、争取专家参与或进行市场分析)来减少不确定性 1.3. 为多种结果做好准备 1.3.1. 制定可用的解决方…

高级 I/O【Linux】

阅读前导: “高级 I/O”处于知识树中网络和操作系统的最后,因此本文默认读者有计算机网络和操作系统的基础。 1. 什么是 I/O 下面以“流”(stream)和冯诺依曼体系架构的视角来简单回顾一下什么是 I/O: I/O可以理解…

2023全新小红书图集和视频解析去水印网站源码

2023全新小红书图集和视频解析去水印网站源码 小红书视频图集解析网站源码,在红书看到好看的图片以及好看的头像,但是直接下载又有水印就非常难受,这个可以一键解析去除水印,支持统计解析次数,本地接口。 源码下载&a…

【C++】指针与引用(学习笔记)

一、左值与右值 左值:编译器为其单独分配了一块存储空间,可以取其地址的,可以放在赋值运算符左边 右值:数据本身。不能取到其自身地址,只能赋值运算右边 左值最常见的情况如西数和数据成员的名字 右值是没有标识符、…

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境:windows 11 k8s版本:v1.25 dashboard版本:v2.7.0 calico版本: v3.26.1 CentOS8版本:4.18.0-348.7.1.el8_5.x86_64 用到的脚本: https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…

2023去水印小程序源码修复版-前端后端内置接口+第三方接口

去水印小程序源码,前端后端,内置接口第三方接口,修复数据库账号密码错误问题,内置接口支持替换第三方接口,看了一下文件挺全的,可以添加流量主代码,搭建需要准备一台服务器,备案域名…

论文阅读--Energy efficiency in heterogeneous wireless access networks

异构无线接入网络的能源效率 论文信息:Navaratnarajah S, Saeed A, Dianati M, et al. Energy efficiency in heterogeneous wireless access networks[J]. IEEE wireless communications, 2013, 20(5): 37-43. I. ABSTRACT && INTRODUCTION 本文提出了无…

【虚拟机栈】

文章目录 1. 虚拟机栈概述2. 局部变量表(Local Variables)3. 操作数栈4. 动态链接4.1 方法的调用:解析与分配 1. 虚拟机栈概述 每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次…

互联网Java工程师面试题·Redis 篇·第二弹

目录 16、Redis 集群方案什么情况下会导致整个集群不可用? 17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 18、Jedis 与 Redisson 对比有什么优缺点? 19、Redis 如何设置密码及验证密码? 20、说说 Redis…

CSS学习笔记

目录 1.CSS简介1.什么是CSS2.为什么使用CSS3.CSS作用 2.基本用法1.CSS语法2.CSS应用方式1. 内部样式2.行内样式3.外部样式1.使用 link标签 链接外部样式文件2.import 指令 导入外部样式文件3.使用举例 3.选择器1.基础选择器1.标签选择器2.类选择器3.ID选择器4.使用举例 2.复杂选…

【微服务】RedisSearch 使用详解

目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶…

EasyX图形库note4,动画及键盘交互

大家好,这里是Dark Flame Master,专栏从这篇开始就会变得很有意思,我们可以利用今天所学的只是实现很多功能,同样为之后的更加好玩的内容打下基础,从这届开始将会利用所学的知识制作一些小游戏,废话不多说&…