Java基础笔记:Day_13 异常机制相关

尚硅谷JAVA基础笔记吐血整理 第1章 JAVA语言概述第2章 基本语法第3章 数组形参:方法定义时,声明的小括号内的参数实参:方法调用时,实际传递给形参的数据方法的形参传递机制:值传递如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值相同点:1、定义变量的格式:数据类型 变量名=变量值2、先声明后使用3、变量都有其作用域不同点:1、在类中声明的位置不同,属性直接定义在类的{}内,局部变量声明在方法内,方法形参,代码块内,构造器 形参、构造器内部的变量2、权限修 阅读详情

一、异常机制

1.异常机制的引入

先入为主的一个概念:在以往的一些学习过程中,我们往往把一些错误用if-else语句进行处理。比如:如果一个字符串的输入并不是我们需要的,我们就用if-else对其进行控制(如果不是满足某种格式的话),以达到我们想要的结果。但是有些问题并不能解决的如此顺利,甚至它会影响到程序的运行。此时,异常机制就显得尤为重要了。

在程序当中,错误可能产生于程序员根本没有预料到的情况,或者是超出了程序员可控范围之内,比如:输入数据非法、试图访问根本不出存在的地址等。异常往往是程序在执行期间发生的事情,它中断了正在执行的程序正常指令流。

		String str = null;
		System.out.println(str.toString());
		//Exception in thread "main" java.lang.NullPointerException
		//空指针异常
		//上述代码异常时,下面的代码将不会执行
		System.out.println(30/0);
		//Exception in thread "main" java.lang.ArithmeticException: / by zero
		//算术异常

对于这些非正常情况(发生的时候回中断程序运行),一般都分两种情况:
①.Error一般是JVM相关的不可修复的错误,比如:内存溢出、系统崩溃等。此时由JVM抛出,我们无法处理。常见的有:StackOverflowError(程序递归过深发生内存溢出)
②.Exception表示异常。程序出现了不正常情况,并且可以修复。常见的有空指针异常和数组越界异常等。
当异常出现时,必须处理异常!!!

2.异常捕捉try/catch

如果异常出现了,我们通常会使用try/catch语句来处理异常。其语法如下:

try{
	//可能出现异常的代码块
}catch(异常类型  自定义的异常名e)
{
		//处理异常的代码
		//记录日志/打印异常信息/抛出异常
}

需要注意的是:try/catch都不能单独使用,必须连用!
那么,如何获取异常信息呢?我们往往使用Throwable类的方法,如getMessage()等。代码示例如下:

public class Demo{
	public static void main(String[] args) {	
		System.out.println("Begin!");
		try {
			int num = 10/0;
			System.out.println(num);//出现异常,此句不执行。转而执行Catch代码块
		}catch(ArithmeticException e) {
			System.out.println("About Exception:" + e.getMessage());
			//String getMessage()我们一般用来提示用户。输出错误性质
			System.out.println("Exception : " + e.toString());
			//String toString()一般我们不用。输出异常的类型和性质
			e.printStackTrace();
			//void printStackTrace() 我们在开发中常用,多用,方便调试和修改。
		}
		System.out.println("End!");
	}
}

但是这仅仅是发生了一个算术异常, 在实际开发中也有可能会遇到多个异常的情况。此时的代码就应该是这样的:

try{
	//可能出现异常的代码块
}catch(异常类型A  自定义的异常名e1)
{
		//处理异常的代码
		//记录日志/打印异常信息/抛出异常
}catch(异常类型B 自定义的异常名e2)
{
		//处理异常的代码
		//记录日志/打印异常信息/抛出异常
}

需要注意的是:①在一个catch语句中,只能捕获中类型的异常,如果需要捕获多种异常,就需要使用catch语句。
②代码在一瞬间只能出现一种类型的异常,只需要一个catch捕捉,但是绝对不会同时出现多个异常。

当然,一个完整的异常处理也是需要finally语句。它的作用是:无论程序有无异常发生,无论try/catch语句是否顺利执行,它总会执行finally语句。当然也会有4种特殊情况:
①.finally代码块中发生了异常。
②.前面的代码使用了System.exit()退出程序
③.程序所在的线程死亡
④.关闭CPU

public class Demo_01 {
	public static void main(String[] args) {	
		System.out.println("Begin!");
		try {
			int num = 10/0;
			System.out.println(num);//出现异常,此句以下不执行。转而执行Catch代码块
		}catch(ArithmeticException e) {
			System.out.println("About Exception:" + e.getMessage());
			//String getMessage()我们一般用来提示用户。
			System.out.println("Exception : " + e.toString());
			//String toString()一般我们不用。
			e.printStackTrace();
			//void printStackTrace() 我们在开发中常用,多用,方便调试和修改。	
			
			System.exit(0);
			//加入此句finally将无法执行
		}finally {
			System.out.println("Shut Down!");
			
		}
		System.out.println("End!");
	}
}

那么,此时又对于finally有个小小的问题:下列代码输出什么值呢?


**public class Demo_01 {
	public static void main(String[] args) {	
		int num = testMethod();
		System.out.print(num);
	}
	
	private static int testMethod()
	{
		try {
			return 1;
		}finally {
			return 1001;
		}
	}
}**

通过Debug后,可以看到的是,当进入testMethod()后,首先执行的try语句,但是并没有执行return 1而是直接跳入到了finally中。可以得到:finally是先于return执行的。

3.异常与Throwable

异常的分类:
①.编译时期异常:checked异常。在编译时期就是检查,如果没有处理异常将会编译失败。比如上面提到的算术异常。处理方案有二:1.使用throw抛出;2.使用try/catch。
②.运行时期异常:在运行时期检查的异常,不会影响编译器检测(不报错)。运行异常:在编译时期可处理可不处理。
在这里插入图片描述
在这里插入图片描述
但是我们多数还是使用Runtime异常,受检异常真的很难处理。

4.抛出异常
有两种方法抛出异常:throw和throws。
①.用throw抛出异常的时候,是运用于方法内部的,抛出一个具体的异常对象(是对象)。语法格式为:

throw new 异常类("异常信息");//后终止方法。

具体应用:

public class Demo_01 {
	public static void main(String[] args) {	
		
		try {
			int ret = divide(12,0);
			System.out.println(ret);
		}catch(ArithmeticException e) {
			System.out.println(e.getMessage());
		}
	}
	
	private static int divide(int num1,int num2)
	{
		System.out.println("Begin!");
		if(num2 == 0){
			throw new ArithmeticException("除数不能为0");
			//执行完此句后,后面的句子均不能执行了
			//return是返回一个值,它就相当于返回一个错误给调用者
		}
		try {
			int ret = num1/num2;
			System.out.println("结果 = " + ret);
			return ret;
		}catch(ArithmeticException e) {
			e.printStackTrace();
		}
		System.out.println("End!");
		return 0;	
	}
	

同时,对于Java的源代码中,也有类似。比如:String类中的charAt()方法,如果参数为-1的话,会有StringIndexOutOfBoundsException异常。源代码为:
在这里插入图片描述
②.throws用于方法声明之上,表示该方法不处理异常而是提醒方法的调用者来处理异常(抛出异常)。语法格式:

	修饰符 返回类型 方法名 (参数列表) throws Exception{}

代码示例如下:

public class Demo_01 {
	public static void main(String[] args) throws Exception{	
		divide(10,0);
	}
	
	//不处理这类型的异常,提醒调用者处理
	private static int divide (int num1,int num2) throws Exception 
	{
		System.out.println("Begin!");
		if(num2 == 0){
			new Exception("除数不能为0");
		}
		try {
			int ret = num1/num2;
			System.out.println("结果 = " + ret);
			return ret;
		}catch(ArithmeticException e) {
			e.printStackTrace();
		}
		System.out.println("End!");
		return 0;	
	}	
}

如果都不处理异常,连主方法也不处理异常,那么将继续抛出给JVM,底层的处理机制就是打印异常的跟踪栈信息。runtime异常默认的就是这种处理方式。
以上代码的异常结果:
在这里插入图片描述
5.自定义异常结果

在开发中,根据需要自定义异常。异常类如何定义?
方法一:自定义一个受检查的异常类:自定义类 并继承于java.lang.Exception
方法二:自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException
(此刻再次提倡我们使用RuntimeException)。

例如已经定义好的了ArithmeticException:

在这里插入图片描述
代码示例(自定义一个LogicException异常,模拟一个注册用户名判断机制):

//自定义的异常
public class LogicException extends RuntimeException {

	private static final long serialVersionUID = 1L;
	public LogicException() {
		super();	
	}
	public LogicException(String message, Throwable cause) {
		super(message, cause);
		/*
		 * @param message 表示当前异常的原因/信息
		 * @param cause   表示异常的根本原因
		 * */
	}
	public LogicException(String message) {
		super(message);
	
	}
}
//用户名判重机制代码
public class RegisterDemo {
	
	private static String[] names = {"Lucy","Jack"};//模拟数据库提供的信息
	public static void main(String[] args) {
		try {
			checkUsername("Lucy");
			System.out.println("Congratulations!");
		}catch(LogicException e) {
			//处理异常
			String errorMsg = e.getMessage();
			System.out.println(errorMsg);
		}
	}
	
	public static boolean checkUsername(String username)
	{
		for(String name : names) {
			if(name.equals(username)) {
				throw new LogicException("Registered!");
			}
		}
		return true;
	}
}

最后,总结一下异常机制的使用原则:
①.异常只能用于非正常情况,毕竟try-catch会影响性能。
②.需要为异常提供说明文档,比如Java doc,如果自定义了一个异常或者某一个方法抛出了异常。我们应该记录在文档注释中。
③.尽可能避免一些没有必要的异常,比如算术异常和空指针异常。
④.异常的粒度很重要。应该为一个基本操作提供try-catch代码块,而不是对几百行代码使用。
⑤.不建议在循环中使用异常处理。
⑥.自定义异常尽量使用RuntimeException,它真的很好用。

JavaSE进阶基础这一篇就够了,你值得拥有! 本Java视频教程适合有一定编程语言基础的学员观看,在本Java视频教程中讲解了Java开发环境搭建、Java基础语法、面向对象、异常、数组、常用类、集合、IO流、线程、反射机制。该Java视频教程为讲师上课实录,共60个课时(1小时为1个课时),讲师语言表达流利,思路清晰。如果您是有一门编程语言基础的,或者您现在是一名Java程序员且想巩固一下JavaSE的,请打开Java视频教程观看吧!... 阅读详情

相关推荐

day13:Scanner、Arrays数组的工具类、异常、集合Collection

一、Scanner(了解) 1.概念:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描==>就是一个文本扫描器 2.构造方法 构造方法的名称 构造方法的描述 public Scanner(File source) 构造一个新的 Scanner 扫描指定的文件 public Scanner(String source) 构造一个新的 Scanner,它生成的值是从指定字符串扫描的(这个字 符串一般表示的就是文件的路径) public

m0_45209551的博客 482

【JavaSE基础】Java异常

Java异常 异常就是在程序的运行过程中所发生的意外事件,它中断指令的正常执行。可能导致程序发生非正常情况的原因有很多,如数组下标越界、算术运算被0除、空指针访问、试图访问不存在的文件等。 异常的类层次(常见) Java 异常处理机制: Error: 错误 Error 类指的是系统错误或运行环境出现的错误,这些错误一般是很严重的错误,即使捕捉 到也无法处理,由 Java 虚拟机生成并抛出,包...

Sampson_S的博客 382

密码学新手必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学新手提供了系统性的三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文学习指南。内容涵盖如何高效获取最新论文资源、结构化精读论文的方法论,以及将理论转化为代码实践的路径,旨在帮助初学者快速构建密码学知识体系并应用于研究。

weixin_29214691的博客 317

day_13_2java的异常

java中异常处理的方式

qq_64646478的博客 1150

MAX3232芯片引脚功能详解与外围电路设计避坑指南(从电荷泵到静电防护)

本文详细解析了MAX3232芯片的引脚功能与外围电路设计,重点介绍了其电荷泵架构和RS232通信接口的应用。通过实际案例和参数对比,提供了电路设计中的常见问题解决方案和静电防护建议,帮助工程师优化工业控制与嵌入式系统中的通信可靠性。

weixin_30596165的博客 432

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1975

JAVA学习 DAY16 Java 异常

本文是Java异常处理的学习笔记,全面介绍了Java异常的概念、体系结构、分类及处理方法。主要内容包括:1.异常的分类(编译时异常和运行时异常);2.异常处理方式(throw、throws、try-catch、finally);3.异常处理流程和自定义异常类实现;4.异常处理的最佳实践(使用具体异常类型、清晰异常信息、合理关闭资源等)。文章提供了大量代码示例,帮助读者理解异常处理机制,并给出编写健壮程序的建议。适合Java初学者和需要巩固异常处理知识的开发者参考学习。

HRDMN的博客 941

Python 爬虫实战:爬取 B 站 UP 主投稿数据,分析更新频率与粉丝互动

摘要:本文基于Python技术实现B站UP主投稿数据的自动化爬取与分析。通过解析B站WBI签名机制和API接口,获取UP主视频的标题、播放量、点赞数等核心数据。采用时间序列分析统计更新频率,结合相关性分析挖掘内容特征与粉丝互动的关联。结果显示编程类视频播放量最高,10-20分钟时长的视频表现最佳,投币数与播放量相关性达0.92。文章详细介绍了接口分析、反爬应对等关键技术,为内容创作者优化策略提供数据支持,同时强调遵守平台规范的爬取原则。

2503_91057718的博客 1537

day 13:Java中的异常(excptions)

package bamzhy.day13; /* thowable类时java语言中所有错误或异常的超类 两个子类的实例error和exception exception是指一些相对来说不那么严重的我们自己能够解决的异常状况 一种是可以被遇见到的,另一种的在运行过程中不太好遇见到但又确实有可能发生的 当发生异常时,默认的执行流程: 1、首先从异常发生的地方终止我们的代码执行 2、转而执行虚拟机应对

代码赋予我力量 286

Google Cameraserver 看门狗CameraServiceWatchdog超时crash原理分析

本文分析了Android CameraServiceWatchdog机制的工作原理。该看门狗用于监控相机服务关键操作(如close、flush)的超时情况,通过定时器线程检测阻塞问题。文章详细讲解了Watchdog的初始化流程、使能方式、内部定时器机制(默认周期100ms,650次循环触发超时),并提供了configureStreams阶段的客制化实现方案。当检测到超时,Watchdog会触发abort生成tombstone日志,便于调试分析。

1130

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 810

Java自学笔记Day13

Day13 常见对象StringBuffer StringBuffer类的概述 A:StringBuffer类概述 *线程安全可以改变字符序列; B:StringBuffer和String的区别: *String是一个不可改变的字符序列; *StringBuffer是一个可改变的字符序列 StringBuffer构造方法 package com.heima.stringbuffer; p...

weixin_43597282的博客 180

YOLO26改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 210

【Java学习|黑马笔记|Day13】常见API|Math、System、Runtime、Object、Objects、Biglnteger

2)System System也是一个工具类,提供一些与系统相关的方法计算机中的时间原点:1970年1月1日 00:00:00 3)Runtime 方法名 说明 public static getRuntime() 当前系统的运行环境对象 public void exit(int status) 停止虚拟机 public int avaibleProcessors() 获得CPU的线程数 public long maxMemory() JVM能从系统中获取总内存大小 pub

2401_87144364的博客 1033

YOLOv8 超参数调优教程! 使用Ray Tune进行高效的超参数调优!

YOLOv8超参数调优教程!😎 使用Ray Tune进行高效的超参数调优!

Coding... 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

day13_异常

java异常体系,异常的捕获和抛出以及自定义异常,特殊写法finally的作用

沐沐 154

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Day13补 深入类加载机制及底层

1.类加载机制(注重加载过程和面试题)

weixin_69595694的博客 1105

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Java教程】Day 6-03 异常处理:异常的传播与处理

在Java中,当一个方法抛出异常且该方法没有捕获异常时,异常会继续向上层方法传播,直到被某个try...catch语句捕获为止。异常传播是Java异常机制的一部分,能够帮助开发者定位和修复问题。

max202011161630的博客 408

JAVA学习笔记day13

1.字符流 1.1为什么会出现字符流 由于字节流操作中文不是特别的方便,所以java就提供字符流 字符流=字节流+编码表 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢? 汉字在存储的时候,无论选择那种编码,第一个字节都是负数 1.2编码表 基础知识: 计算机中存储的信息都是用二进制形式表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果 按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在

qq_41988770的博客 623

JAVA学习笔记DAY3——菜鸟教程Java基础

菜鸟教程面向对象之前的部分都走马观花看了一遍。用于突击学习和复习。

weixin_47227105的博客 1477

Java异常相关知识总结

异常: 概述:java程序运行过程中出现的错误 常见的异常: StackOverflowError ArrayIndexOutOfBoundsException NullPointerException ClassCastException ParseException 异常的分类:Trowable:  1.--Error: a.相当于天灾人祸,虚拟机...

weixin_30546933的博客 119

Java学习day13

【代码】Java学习day13。

qq_57902421的博客 126

袁硕的学习笔记day13

多态 1. 为什么需要多态 需求:现在拥有两个宠物类:猪类、狗类,定义了主人类要求提供给宠物喂食的方法 问题1:当宠物数量增多时,还要去重新定义喂食的方法 这种方式对于程序来讲扩展性太差 可以借鉴int和double类型的转换(类似)所以采用多态来提升程序的扩展性 将喂食直接定义为喂食宠物的方法,未来所有宠物的对象都可以使用此方法 public void feeddog(Dog Dog){ } ...

qq_39313901的博客 147

Java Day13

引用变量的注意事项(空指针异常)、递归的概念和应用、封装、JavaBean

m0_74778189的博客 269

2022-7-13 学习日记(5th day)JAVA基础

Java基础

weixin_49627122的博客 232
上一篇: Java基础笔记:Day_12 String类、日期类
下一篇: Java基础笔记:Day_14 多线程与synchronized
Panda不姓潘
博客等级 码龄8年 152粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值