详解Java异常(Exception)处理及常见异常
liuian 2025-06-15 17:36 82 浏览
很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。
计算机程序的编写也需要考虑处理这些异常情况。异常(exception)是在运行程序时产生的一种异常情况,已经成为了衡量一门语言是否成熟的标准之一。目前的主流编程语言java也提供了异常处理机制。
异常简介
Java
中的异常又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类,这可以让程序具有极好的容错性且更加健壮。
在 Java 中一个异常的产生,主要有如下三种原因:
- Java 内部错误发生异常,Java 虚拟机产生的异常。
- 编写的程序代码中的错误所产生的异常,例如空指针异常、数组越界异常等。
- 通过 throw 语句手动生成的异常,一般用来告知该方法的调用者一些必要信息。
Java 通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法会产生代表该异常的一个对象,并把它交给运行时的系统,运行时系统寻找相应的代码来处理这一异常。
我们把生成异常对象,并把它提交给运行时系统的过程称为拋出(throw)异常。运行时系统在方法的调用栈中查找,直到找到能够处理该类型异常的对象,这一个过程称为捕获(catch)异常。
例 1
为了更好地理解什么是异常,下面来看一段非常简单的 Java 程序。下面的示例代码实现了允许用户输入 1~3 以内的整数,其他情况提示输入错误。
package io.renren.config;
import java.util.Scanner;
/**
* Created by LiYangYong
*/
public class TestException {
public static void main(String[] args) {
System.out.println("请输入您的选择:(1~3 之间的整数)");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
switch (num) {
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("error");
break;
}
}
}正常情况下,用户会按照系统的提示输入 1~3 之间的数字。但是,如果用户没有按要求进行输入,例如输入了字母,则程序在运行时将会发生异常,运行结果如下所示。
请输入您的选择:(1~3 之间的整数)
223sdf
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at io.renren.config.TestException.main(TestException.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1异常类型
为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error,如图 1 所示。
由图 2 可以知道,Throwable 类是所有异常和错误的超类,下面有 Error 和 Exception 两个子类分别表示错误和异常。其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
- Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。
- Error 定义了在通常环境下不希望被程序捕获的异常。一般指的是 JVM 错误,如堆栈溢出。
本节不讨论关于 Error 类型的异常处理,因为它们通常是灾难性的致命错误,不是程序可以控制的。接下来将讨论 Exception 类型的异常处理。
运行时异常都是 RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常(一般情况下不自定义检查异常)。
表 1 和表 2 分别列出了 java.lang 中定义的运行时异常和非运行时异常的类型及作用。
异常类型 | 说明 |
ArithmeticException | 算术错误异常,如以零做除数 |
ArraylndexOutOfBoundException | 数组索引越界 |
ArrayStoreException | 向类型不兼容的数组元素赋值 |
ClassCastException | 类型转换异常 |
IllegalArgumentException | 使用非法实参调用方法 |
lIIegalStateException | 环境或应用程序处于不正确的状态 |
lIIegalThreadStateException | 被请求的操作与当前线程状态不兼容 |
IndexOutOfBoundsException | 某种类型的索引越界 |
NullPointerException | 尝试访问 null 对象成员,空指针异常 |
NegativeArraySizeException | 再负数范围内创建的数组 |
NumberFormatException | 数字转化格式异常,比如字符串到 float 型数字的转换无效 |
TypeNotPresentException | 类型未找到 |
异常类型 | 说明 |
ClassNotFoundException | 没有找到类 |
IllegalAccessException | 访问类被拒绝 |
InstantiationException | 试图创建抽象类或接口的对象 |
InterruptedException | 线程被另一个线程中断 |
NoSuchFieldException | 请求的域不存在 |
NoSuchMethodException | 请求的方法不存在 |
ReflectiveOperationException | 与反射有关的异常的超类 |
好了、今天就分享到这儿吧
相关推荐
- 宽带连接错误651是什么意思(宽带连接错误651是什么意思呀)
-
宽带连接错误651为调制解调器(modem)发出的错误报告,一般情况下是未找到指定的端口。以下介绍以下这种错误发生的情况和具体的解决方法:【宽带连接错误651是什么意思】 遇到宽带连接错误651时,...
- 电脑重装系统在哪里(电脑重装系统去哪里比较好)
-
重装电脑系统是一个相对复杂的过程,首先需要备份重要数据,然后准备一个可启动的安装介质,如U盘或光盘。接下来,进入BIOS设置,将启动顺序调整为首先从安装介质启动。然后,按照屏幕上的指示进行系统安装,选...
- win10专业版激活密钥无法激活
-
如果您的Windows10专业版激活密钥被阻止,您可以尝试以下几种方法:1. 检查激活密钥是否正确:请确保您输入的激活密钥是正确的,并且与您的Windows10专业版版本匹配。2...
- 闪迪内存卡数据恢复(闪迪sd卡数据恢复)
-
首先,不要继续往闪迪内存卡中写入新的数据,以免覆盖原有数据。然后,可以使用数据恢复软件来尝试恢复误删的文件,如Recuva、EaseUSDataRecoveryWizard等,这些软件可以扫描内...
- 电脑内存条通用吗(电脑内存条通用吗怎样区分)
-
不是通用的。内存条是CPU可通过总线寻址,并进行读写操作的电脑部件。电脑上的内存条是不通用的,选择内存条的时候,需要查清主板支持的内存条的种类,在电脑上安装主板支持的内存条。内存条分为DDRDDR2...
- 系统维护中怎么解决(系统维护中一般要多久才能恢复)
-
系统正在维护中意思是系统正在更新或者升级中。网站或软件代码程序出现了问题,或者网站、软件需要更新升级的时候,一般会关闭进行查找问题,处理问题,内容进行更新。处理完了才会开通网站访问。为了清除系统运行中...
- 电脑桌面隐藏的文件夹怎么找出来
-
要查看电脑上隐藏的文件夹,可以采取以下几种方法:方法一:使用文件夹选项按下键盘上的Windows键和E键打开“文件资源管理器”。找到“查看”和“选项”两个选项并勾选。选中“显示隐藏的文件、文件夹和驱动...
- 搜狗中文手写输入法下载(下载搜狗手写版)
-
点击输入框弹出搜狗键盘,进入搜狗工具栏的设置图标,手写设置,勾选“手写注音”。在输入法点击那个键盘,就会有那个输入方式的选项,选择手写输入就可以了。呼出输入法,点击输入法上方的键盘图样,找到手写输入,...
- 免费云服务器怎么样(云服务器哪些是免费)
-
搞软件开发的人都知道,对于一些网络应用软件必须要租用服务器存放才能被更多用户使用。如一些应用于浏览软件、传输软件、远程登录软件等。如果是像以往那样租用物理机服务器,成本费用非常高昂。但是现在有云服务器...
- 斐讯路由器登录密码忘记了怎么办
-
1.斐讯无线路由器密码忘记,要重设密码,首先长按路由器背面的reset键,将路由器恢复出厂设置。2.路由器恢复出厂设置以后,在电脑浏览器地址栏中输入:192.168.1.1并按下回车键,“用户名”输...
- 软件之家软件分享(软件之家软件合集)
-
驱动精灵,驱动人生,360驱动大师。云之家挺好用的,通讯录是按组织架构的,跟微信一样可以看到所有人的动态,还有小组一般是按公司、部门、行业、兴趣分的,老板开讲可以把最上级的意思快速传达给所有员工。我们...
- 鲁大师下载安装免费版(鲁大师app下载)
-
解决方法吧。第一种方法:一般情况下,我们安装的时候软件也需要一定的时间,我们可以多等待一会。第二种方法:安装到99%你直接关掉安装。然后自己到安装目录文件里找到启动程序,就可以用了。第三种方法:1、可...
- ssd坏道检测与修复(ssd硬盘坏道检测)
-
1、固态硬盘(SSD硬盘)损坏分两方面,一方面是出现硬盘坏块,另一方面是出现物理损坏。2、固态硬盘如果出现坏块是不可修复的。SSD硬盘坏块不是所谓的逻辑坏块。SSD硬盘内部是晶体管,损坏后不能恢复,这...
- win10专业工作版激活密钥(windows10 专业版激活密钥)
-
要获得Windows10专业版永久激活密钥,可以通过微软官方零售渠道或可靠的第三方卖家购买正版产品密钥。使用第三方卖家时,务必注意其信誉和真实性。激活后,密钥将与您的Microsoft帐户关...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
