18.Java异常

news2024/9/22 15:42:07

Java异常

Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,Java中引入了异常类的概念。异常类的引入即明确了程序在执行过程中发生的什么问题,又提供类针对异常进行处理的解决方案。
在这里插入图片描述
Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

Exception::程序本身可以捕获并且可以处理的异常(包括自定义异常)。

运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。包括我们在编写代码时的一些错误,无法通过编译的代码,称谓编译期异常,也属于非运行时异常。

异常产生的原因

在 Java 中一个异常的产生,主要有如下三种原因:

  • Java 内部错误发生异常,Java 虚拟机产生的异常。
  • 编写的程序代码中的错误所产生的异常,例如空指针异常、数组越界异常等。这种异常称为未检査的异常,一般需要在某些类中集中处理这些异常。
  • 手动生成的异常,这种异常称为检査的异常,一般用来告知该方法的调用者一些必要的信息。

异常的处理方式

捕获异常:try,catch,finally

try {
   ... 
} catch (Exception e) {
    ... 
} finally {
    ... 
}


  • try代码块:监视代码执行过程,如果代码发生异常,则跳转到catch代码块进行处理。
  • catch代码块:可选执行代码块,如果try代码块未发生异常,则不会被执行。并且一个try代码块可以跟随多个catch代码块,根据不同的Exception处理不同的异常,这种情况称之为多重捕获。
  • finally代码块:不论try代码块是否发生异常,finally代码块都会被执行,通常用于处理工作。

抛出异常:throws

Java允许在方法的后面使用throws关键字对外声明该方法有可能发生异常,这样调用者在调用方法时,就明确地知道该方法有异常,并且必须在程序中对异常进行处理,否则编译无法通过。
程序员在写代码时,可能预感到会发生异常,那么会手动抛出一个异常,交由使用者去处理

public static void main(String[] args) {
		TryTest t=new TryTest();
		double d=t.chu(4,2);
		System.out.printLn(d);
	}
	public double chu(double a,double b)throws Exception{
		return a/b;
	}

如果方法被调用方法抛出一个异常,那么调用者会出现编译错误,无法执行。需要修改成为:

public static void main(String[] args) {
		TryTest t=new TryTest();
		double d=0;
		try {
			d = t.chu(4,2);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(d);
	}
	public double chu(double a,double b)throws Exception{
		return a/b;
	}

当方法抛出一个异常时,调用者要么使用try代码块进行捕获,要么继续在本方法上抛出异常,由后续的调用者去处理。

声明异常:throw

如果需要在程序中自行抛出异常,则应使用 throw 语句,throw 语句可以单独使用,throw 语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。当 Java 运行时接收到开发者自行抛出的异常时,会中止当前的执行流,跳到该异常对应的 catch 块来处理该异常。即不管是系统自动抛出的异常还是程序员手动抛出的异常,Java 运行时环境对异常的处理没有任何差异。
如果 throw 语句抛出的异常是 Checked 异常,则该 throw 语句要么处于 try 块里,显式捕获该异常,要么放在一个带 throws 声明抛出的方法中,即把该异常交给该方法的调用者处理;
如果 throw 语句抛出的异常是 Runtime 异常,则该语句无须放在 try 块里,也无须放在带 throws 声明抛出的方法中;程序既可以显式使用 try…catch来捕获并处理该异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。

public static void main(String[] args) {
		TryTest t = new TryTest();
		try {
		double d = t.chu(4, 0);
		System.out.println(d);
		}catch (Exception e) {
			System.out.println("0不能做除数");
		}
	}

	public double chu(double a, double b) {
		if(b==0) {
			throw new RuntimeException();
		}
		return a / b;
	}

常见异常

在这里插入图片描述

自定义异常

在程序开发中,可能会遇到程序特有的问题,那么程序员在处理这些特有的问题时,一般会自定义一些异常来使用,这样既能保证程序的安全性和稳定性,又能给出较为友好的提示,以便于使用。

异常可以继承的类

  • 继承Throwable类
  • 继承Exception类
  • 继承RunTimeException类

一般会选择继承Exception和RuntimeException,如果不要求调用者一定要处理抛出的异常,就继承RuntimeException。

public class NumberIsZoraException extends Exception{

	public NumberIsZoraException(String msg) {
		super(msg);
	}
}

public static void main(String[] args) {
		TryTest t = new TryTest();
		double d=0;
		try {
			d = t.chu(4, 0);
		} catch (NumberIsZoraException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public double chu(double a, double b) throws NumberIsZoraException {
		if(b==0) {
			throw new NumberIsZoraException("除数不能为0");
		}
		return a / b;
	}

在这里插入图片描述

异常的使用原则

java的异常处理涉及到程序流程的跳转,所以虚拟机需要保存程序的执行流程,以便异常发生时能正确的跳转,这也就导致了使用异常时会引起额外的开销,所以,要谨慎地使用异常。
使用异常有如下几个原则:
1、尽量避免使用异常,将异常情况提前检测出来。
2、不要为每个可能会出现异常的语句都设置try和catch。
3、避免在方法中抛出(throw)或者捕获(catch)运行时异常RuntimeException和Error。
4、避免总是catch Exception或Throwable,而要catch具体的异常类。这样可以使程序更加清晰。
5、不要压制、隐瞒异常。将不能处理的异常往外抛,而不是捕获之后随便处理。
6、不要在循环中使用try…catch,尽量将try…catch放在循环外或者避免使用。

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

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

相关文章

QT stackUnder 用法小结

stackUnder是什么意思?根据官方的解析,简而言之一句话:把窗口的小部件放置于父窗口的堆栈窗口中。本文将通过一则简单的示例,来具体解析stackUnder该如何使用。 官方解析 void QWidget::stackUnder(QWidget *w) Places the widg…

ThinkPHP6之数据库操作上

ThinkPHP6之数据库操作上 前言1. 数据库配置2. 数据库操作1. 查询操作2. 插入操作3. 修改4. 删除5. 其他 3.数据集总结 前言 注意,tp6在进行语法学习的时候都是在app/index.php中写代码的,代码写在index函数下面,而且tp6自带的文件都是由自动…

经常打电话的人用什么耳机好?通话质量好的蓝牙耳机推荐

用蓝牙耳机听歌、刷视频、玩游戏已经成为趋势,作为人手必备的一件单品,在款式层出不穷,功能各异的蓝牙耳机市场,许多人都不知道究竟什么蓝牙耳机好?下面整理了几款通话质量好的蓝牙耳机。 一、南卡小音舱Lite2蓝牙耳机…

【服务器数据恢复】Raid磁盘阵列常见故障类型原因分析

由于raid的特点和优势,磁盘阵列技术被广泛应用于服务器和存储等商用领域。由于用户基数大,出现故障的情况也不少。通过这篇文章介绍一下常见的raid磁盘阵列数故障类型和原因。 故障类型一、磁盘阵列处于降级状态时未及时rebuild。 RAID磁盘阵列的数据安全…

Linux+云服务器

目录 前言 一、Linux介绍 二、Linux 环境搭建 2.1 云服务器 2.2 XShell 终端 三、Linux 常用命令 3.1操作目录的命令 3.1.1 ls 【list的缩写】 双击某个目录 3.1.2 pwd 【print working directory的缩写】打印当前所处地址 3.1.3 cd 【change directory的缩写】切…

DAY02_运算符和选择语句

1:运算符 对数据进行运算。而对数据运算就要用到运算符。 和表达式做一个简单的描述: 运算符:对字面量或者变量进行操作的符号 表达式:用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的…

JUC多并发编程 volatile

特点: 可见性有序性(有时需要禁用重排) 内存语义: 当写一个 volatile 变量时, JMM 会把该线程对应的本地内存中的共享变量值立即刷新回主存中当读一个 volatile 变量时, JMM 会把该线程对应的本地内存设置无效,重新…

m4a怎么转换成mp3,4招搞定

m4a怎么转换成mp3?相信很多朋友都知道,无论是音频、视频、图片等很多电子文件,都会有多种格式。由于格式不统一,很容易导致文件和软件之间出现不兼容的情况,最直接的结果就是在播放器中无法打开,或者使用的…

一篇文章带你了解Spring/SpringBoot常用注解(建议收藏!!! )

这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没啥大问题了! 1. SpringBootApplication 这里先单独拎出SpringBootAppl…

NUXT规范及常见问题

props中不要使用Web环境才有的对象&#xff0c;服务端渲染的时候会失败 使用<Nuxt/>组件代替<router-view/>&#xff0c;使用<NuxtLink/>代替<router-link/>static目录下的资源是静态资源&#xff0c;不应该通过import或../static/img/logo.png等方式…

【AI绘画】我以Midjourney为主学习AI绘画效果咋样?

上一篇博客链接&#xff1a;【ChatGPT】ChatGPT掀起AIGC与AI浪潮_山楂山楂丸的博客-CSDN博客 这周&#xff0c;我加入了新星计划&#xff0c; 涉及的领域是我感兴趣以及对未来规划有帮助的——AI绘画&#xff01;​​​​​​​ 文章目录 前言 一、AI绘画是什么 二、AI绘画进…

MYSQL命令小总结

一、创建查看 1.输入cmd&#xff0c;打开控制器&#xff0c;输入如下&#xff0c;打开MYSQL C:\Users\ASUS> mysql -u root -p 2.查看已有数据库 mysql> show databases; 3.建立数据库 4.使用数据库 use englishword;5.建立表单 CREATE TABLE user ( id INT primar…

AI Stable Diffusion Prompt参数【一】

AI Stable Diffusion Prompt参数【一】 配置场景1:草丛里的女性promptNegative Prompt结果 场景2: 雨中披头散发的女孩promptNegative Prompt结果 场景3: 一个女孩和她的朋友在逛街promptNegative Prompt结果 场景4: 学生在教室promptNegative Prompt结果 场景5: 穿着白色丝袜和…

自动化工具 基于 Antd+DRF 开发了一款适配 JMeter 的接口自动化测试报告

JMeter Report 基于 AntdDRF 开发的一款 JMeter 测试报告服务&#xff0c;用于在 JMeter 接口测试中使用。 &#x1f334; 背景 JMeter 是测试工作中常用的一款工具&#xff0c;除了压测还可以用来做接口自动化的测试。 从事测试多年&#xff0c;接口自动化也做过很多的尝试…

从零搭建开发脚手架 自定义打包构建研发输出产物

文章目录 背景目录源码目录结果目录 实现项目打包方式一 使用IDEA工具打包,选择对应的profiles,然后clean package方式二 使用maven命令打包 部署 背景 在打包项目时&#xff0c;通常只需要生成一个可执行的jar文件。然而&#xff0c;有时候需要将启动脚本或外部配置文件附加到…

Java版电子招投标系统源码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

感应开关盖垃圾桶项目实现.md

1.项目接线 接线示意图和实物图 示意图和接线说明&#xff1a; 舵机控制口P1.1&#xff08;定时器0中断&#xff09;&#xff1b;超声波Trig接P1.5 ,Echo接P1.4 &#xff1b;蜂鸣器接P2.0 口;震动传感器接P3.2 口&#xff08;外部中断0&#xff09;。 实物图&#xff08;未封装…

室内人员定位,硬件部署方案多场景技术分析

室内外定位技术在工业、矿业、医疗养老、能源电力、展览展会、公检法司、工地等众多领域具有丰富的应用场景。定位能力作为“物联网”的核心能力之一&#xff0c;其定位精度和稳定性不仅需要强大的算法支撑&#xff0c;也有赖于好的室内定位设备的落地部署。 基于蓝牙LoRa定位…

MySQL按照,库的操作,表的约束 --- MySQL总结(一)

MySQL 文章目录 MySQLMySQL的安装MySQL组成架构连接池软件层引擎层储存层 库的操作创建库修改数据库删除数据库备份数据库还原数据库查看链接情况 表操作创建表查看表结构修改表结构添加字段修改字段类型长度更改表名修改属性删除表 数据类型表的约束空属性&#xff08;not nul…

typescript全局安装卸载以及npm相关问题

全局安装 npm install -g typescript 全局安装之后&#xff0c;如果想要卸载要使用 npm uninstall -g typescript 全局安装之后可以在终端使用 tsc xxx 编译ts文件 本地安装&#xff0c;也就是在项目目录下安装 npm install typescript 本地卸载 npm uninstall type…