Java 入门指南:初识 Java 异常(Exception)

news2024/9/25 5:24:13

初识Java异常

何为异常

在Java中,异常是一个不需要的或意外的事件,它发生在程序执行期间,即在运行时,破坏了程序指令的正常流程。异常可以被程序捕获(catch)和处理(handle)。

方法中发生异常时,它会创建一个对象,称为异常对象(Exception Object)。它包含有关异常的信息,例如异常的名称和描述以及异常发生时程序的状态。

导致异常的原因

  • 无效用户输入
  • 设备故障
  • 网络连接丢失
  • 物理限制(磁盘内存不足) JVM内存溢出
  • 数组角标越界
  • 代码错误
  • 打开不可用的文件
  • 空指针访问

Error(错误) 与 Exception(异常)

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error如果用System.out.println(11/0),由于用0做了除数,会抛出 java.lang.ArithmeticException异常

Error

Error类及其子类:程序中无法处理的错误,表示程序出现了严重的错误不可恢复的情况,如 Java虚拟机(JVM)内存耗尽、内存泄漏、堆栈溢出错误、库不兼容、无限递归等。

Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。

错误通常超出了程序员的控制范围,当此类错误发生时,应用程序不应该去处理此类错误

Error 和 Exception的区别

错误不是异常

Error 表示一个严重的问题,一个合理的应用程序不应该试图捕捉它

Exception 表示程序本身可以捕获并且可以处理的异常

异常的层次结构

Java 通过 AP I中 Throwable 类的众多子类描述各种不同的异常。因而,Java异常都是对象是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。

所有异常和错误类型都是Throwable类的子类,二者都是 Java 异常处理的重要子类,各自都包含大量子类。Throwable 是层次结构的基类。

一个分支由 Exception 领导。这个类用于用户程序应该捕获的异常情况。

Java运行时系统(JVM)使用另一个分支 Error 来指示与运行时环境本身(JRE)有关的错误。
![[Throwable Hierachy.png]]

异常的种类

![[Types of Java Exceptions.png]]

Exception 分为两类:

  1. Build-in Exception(内置异常)

    • 运行时异常(Unchecked Exception)
    • *编译时异常(Checked Exception)
  2. User-Defined Exceptions(用户自定义异常)

Build-in Exception

内置异常是Java库中可用的异常
![[Checked and Unchecked Error.png]]

运行时异常

RuntimeException类及其子类异常,如 NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常) 表示 JVM在运行期间可能出现的异常。

这些异常是不受检异常(Unchecked),程序中可以选择捕获处理,也可以不处理。若不进行处理,JVM会默认处理:把异常的名称,原因,位置等信息输出在控制台,但是程序就不能继续执行了。

这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。

运行时异常的特点是 Java 编译器不会检查它,当程序中可能出现这类异常,即使没有用 try-catch 语句捕获它,也没有用 throws 子句声明抛出它,也会编译通过。

  • 若这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

  • 如果产生运行时异常,需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!

  • RuntimeException 异常会由JVM自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误),此类异常的出现绝大多数情况是代码本身有问题,应该从逻辑上去解决并改进代码。

非运行时异常(编译时异常)

RuntimeException 以外的异常(包括Error),类型上都属于 Exception 类及其子类。必须手动在代码里添加捕获语句来处理该异常
要么使用 try-catch 捕获,要么使用方法签名中用 throws 关键字抛出。如果不处理,程序就不能编译通过

IOExceptionSQLException 等以及 用户自定义的Exception异常,一般情况下不自定义检查异常。

User-Defined Exceptions

有时,Java 中的内置异常无法描述特定情况。在这种情况下,用户还可以创建异常。

Java 中异常处理的优点如下:

  • 完成程序执行的规定

  • 易于识别的程序代码和错误处理代码

  • 错误的传播

    错误传播是指错误或异常在程序中从一层代码传递到另一层代码的过程。当代码块或函数中出现错误时,可以通过捕获错误在该级别进行处理,也可以将错误传播到程序的更高级别进行进一步处理

    通过传播错误,可以在不同的抽象层次上控制和管理程序的执行。例如,某些错误可能会在函数内部局部处理,而其他错误可能会传播到主函数甚至应用程序的用户界面。

    错误传播允许更好的错误处理和恢复策略。它支持关注点分离和在适当级别处理错误的能力,从而改进代码的模块化和可维护性。它还提供了对错误原因的更好的可见性,并有助于识别和修复问题

  • 准确的错误报告

  • 更准确地识别错误类型

Java 常见异常

在 Java 中提供了一些异常用来描述经常发生的错误,对于这些异常,有的需要程序员进行捕获处理或声明抛出,有的是由 Java 虚拟机自动进行捕获处理。Java 中常见的异常类:

RuntimeException

  • java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

  • java.lang.ArithmeticException 算术条件异常。譬如:整数除零等。

  • java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。
    譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等

  • java.lang.ClassNotFoundException 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历 CLASSPATH 之后找不到对应名称的 class 文件时,抛出该异常。

  • java.lang.NegativeArraySizeException 数组长度为负异常

  • java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常

  • java.lang.SecurityException 安全性异常

  • java.lang.IllegalArgumentException 非法参数异常

IOException

  • IOException:操作输入流和输出流时可能出现的异常。

  • EOFException 文件已结束异常

  • FileNotFoundException 文件未找到异常

其他

  • ClassCastException 类型转换异常类

  • ArrayStoreException 数组中包含不兼容的值抛出的异常

  • SQLException 操作数据库异常类

  • NoSuchFieldException 字段未找到异常

  • NoSuchMethodException 方法未找到抛出的异常

  • NumberFormatException 字符串转换为数字抛出的异常

  • StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

  • IllegalAccessException 不允许访问某类异常

  • InstantiationException 当应用程序试图使用 Class 类中的 newInstance() 方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常

打印异常信息的方法

printStackTrace()

该方法以以下格式打印异常信息:异常名称,异常描述,堆栈跟踪。

import java.io.*

class Demo{
	public static void main(String []args){
		int a=5 , b=0;
		try{
			System.out.print(a/b);
		}
		catch(ArithmeticException e){
			e.printStackTrace();
		}
	}
}
//打印结果:
java.lang.ArithmeticException: / by zero  
at GFG.main(File.java:10)

toString()

该方法以 “异常名称:异常描述” 的格式打印异常信息

import java.io.*

class Demo{
	public static void main(String []args){
		int a=5 , b=0;
		try{
			System.out.print(a/b);
		}
		catch(ArithmeticException e){
			System.out.print(e.toString());
		}
	}
}
//打印结果:
java.lang.ArithmeticException: / by zero

getMessage()

该方法只打印异常的描述

import java.io.*

class Demo{
	public static void main(String []args){
		int a=5 , b=0;
		try{
			System.out.print(a/b);
		}
		catch(ArithmeticException e){
			System.out.print(e.getMessage());
		}
	}
}
//打印结果:
// by zero

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

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

相关文章

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中,寻找main函数在逆向分析中是非常重要的,它是程序的核心执行点,从这里开始,程序的主要逻辑开始展开;在这边我们需要明确两个概念:用户入口(User Entry Point) 和 …

【C语言进阶】深入C语言指针:基础到进阶的跨越

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言数据在内存中的存储 🌹🌹期待您的关注 🌹🌹 ❀C语言指针进阶 &a…

Linux中安装java和tomcat(保姆级教程)

java 篇 JDK是用于开发Java应用程序的软件开发工具包。它包含了编译器、调试器、运行时环境和其他一些开发工具,可以帮助开发人员创建、编译、调试和部署Java应用程序。JDK提供了Java编程语言的开发工具和运行时库,使开发人员能够编写和执行Java代码。 …

TypeScript教程(一)之我们为什么要学TypeScript

根据软件开发设计公司 The Software House 针对 2022 年前端市场状态的调查显示,84% 的受访者都在使用 TypeScript,43% 的受访者甚至认为 TypeScript 将超越 JavaScript 成为前端开发的主要语言。TypeScript 这些年越来越火,可以说是前端工程…

影视会员官方渠道api对接

API对接是指两个不同的软件系统或应用程序之间通过API(应用程序编程接口)进行交互的过程。这种交互允许数据和功能的共享,而不必暴露系统的内部工作原理。在影视会员充值场景中,API对接具有以下几个关键特点和优势: 数…

【Linux系列】AWK命令使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(4)

💖💖💖亲爱的朋友们,热烈欢迎你们来到青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博…

使用VBA快速创建非规则数据图表

实例需求:工作表中共有4组数据,第一组数据涵盖所有日期,其他3组均为断续数据。 现在需要创建如下图所示的线图,由于数据区域是非连续的,因此无法直接创建图表。 需要先将数据表按照日期对齐,如下图所示&…

《深度学习》 OpenCV 计算机视觉入门 (中篇)

目录 一、OpenCV函数使用 1、改变像素值 2、图像切片合并 1)直接截取相加 2)使用cv2.add合并 3)此时亮度太高了,需要降低亮度 3、边界填充 1)常数填充 2)镜面反射填充(复制交界处&…

论文仍在苦恼?分享最实用6款AI论文工具网站的汇总!

论文写作是学术研究中的重要环节,然而,面对繁重的写作任务,许多学者和学生常常感到力不从心。幸运的是,随着人工智能技术的飞速发展,一系列AI论文写作工具应运而生,极大地简化了论文写作流程,提…

【Mybatis】介绍+搭建+参数传递+增删改查操作+事务与连接池

目录 一. Mybatis介绍 二. Mybatis搭建 1. 导入Mybatis依赖的jar包 2. 创建Mybatis全局配置文件 3. 定义一个接口 4. 创建sql映射文件 5. 测试 * MyBatisX插件安装 三. 数据库连接池 四. 参数传递 1. 将数据封装到对象中 2. 使用Param注解 五. 数据库事务 六.…

11、Redis高级:Key设置、BigKey解决、批处理优化、集群下批处理、慢查询

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过…

【golang学习之旅】复杂数据类型——切片(slice)

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

OpenHarmony实战开发: unittest单元测试的编写

背景 程序开发与单元测试二者密不可分,是每个开发人员的基本业务。当功能性代码开发完成后,要自行测试其是否满足设计预期,如果不满足就要回去完善代码,满足则可以提交功能代码及测试用例。 测试用例的另一个重要作用就是阅读者…

【USRP】 Link 16 战术数据链 实训系统

Link 16 战术数据链 实训系统 一、基于USRP的Link16平台简介1、整体架构2、JTIDS终端架构3、平台特点3.1、提高技术理解与应用能力3.2、培养创新思维与问题解决能力3.3、加强跨学科融合与团队合作 4、平台建设4.1、基础理论教学模块4.2、LabVIEW 算法模块4.3、USRP仿真模块4.4、…

如何用ChatGPT快速提升论文质量:实用技巧大公开

近年来,人工智能技术急速发展,尤其在自然语言处理领域取得了显著进展。作为OpenAI推的一款先进的语言模型,ChatGPT不仅在日常交互中表现卓越,也在专业写作领域显示了巨大的潜力。本文旨在详尽介绍如何高效运用ChatGPT来撰写和修改…

JWT双令牌认证实现无感Token自动续约

概念 JSON Web Token (JWT)是一个开放标准(RFC 7519) ,它定义了一种紧凑和自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。此信息可以进行验证和信任,因为它是经过数字签名的。JWT 可以使用机密(使用 HMAC 算法)或使用 RSA 或 E…

LeetCode --- 411周赛

题目列表 3258. 统计满足 K 约束的子字符串数量 I 3259. 超级饮料的最大强化能量 3260. 找出最大的 N 位 K 回文数 3261. 统计满足 K 约束的子字符串数量 II 一、统计满足K约束的子字符串数量I 这种要求满足区间内某种性质的题,一般都可以用滑动窗口来做。这题…

STM32MP157_uboot_初次编译

STM32MP157_uboot_初次编译 前言: 为了快速入门,这边选择直接使用正点原子提供的uboot源码,先体验一下uboot的编译流程,为后面的移植原厂uboot做环境准备。 1、获取正点原子的uboot源码(复制到虚拟机里面) …

均值漂移算法原理及Python实践

均值漂移算法(Mean Shift Algorithm)是一种基于密度的非参数聚类算法,其原理主要基于核密度估计和梯度上升方法。以下是均值漂移算法原理的详细解析: 1. 基本思想 均值漂移算法的基本思想是通过迭代地更新数据点的位置&#xff…