关于异常的总结

本文详细介绍了Java中的异常处理机制,包括异常的继承体系、运行时异常与编译时异常的区别,以及Error与Exception的处理方式。同时对比了throws与throw关键字的使用场景,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、异常的继承体系及分类

 

 java.lang.Object
   java.lang.Throwable
      java.lang.Exception

      java.lang.Error


   
可见,Throwable有两个子类ErrorException,其中异常又分为运行时异常(非强制异常)和编译时异常(强制异常)。

 

运行时异常:也就是非强制异常,比如NullPointerExceptionIndexOutOfBoundsException,都是由于程序员逻辑错误引起的,在程序运行前不会检查,能够编译通过。可以通过改进代码来避免这种异常的发生。

 

编译时异常:也称强制异常,是指能预见但不能控制的异常,如果程序中存在这种异常,就不能编译通过。通常我们需要使用try…catch..语句或者throws来处理。

 

而对于行时错误Error:会编译通过,但是在程序运行时如果出现则会终止运行。对于错误的处理则不用对程序进行处理,应该在程序之外找到逻辑错误的地方。常见错误如:内存不足错误,java.lang.OutOfMemoryError。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。堆栈溢出错误,java.lang.StackOverflowError 。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

 以下是一个栈溢出的例子:

 

public static void main(String[] args) {
		ErrorDemo01 er1 = new ErrorDemo01();
		System.out.println(er1.sum(10000));
	}
	
	public long sum(long a){
		if(a==1){
			return 1;
		}else{
			return sum(a-1);
		}
	}

 

 运行时就报错:Exception in thread "main" java.lang.StackOverflowError

 

 

二、throwsthrow的区别

 

Throw关键字用于方法内部,用来抛出一个异常,如果检查出异常,还应在方法头部声明可能抛出的异常类型。

Throws关键字则适用于方法体外部,声明方法中可能出现的异常。

 

public static void main(String args[]) throws Exception{
		ExceptionDemo01 ed1 = new ExceptionDemo01();
		ed1.throwDemo(-5);
		System.out.println("可执行后面的程序!");
	}
	
	public void throwDemo(int t) throws Exception{
		if(t<=0){
		throw new Exception("t必须为正数!!");
		}
	}

 

  

运行后显示:

 

Exception in thread "main" java.lang.Exception: t必须为正数!!

at exceptionDemo.ExceptionDemo01.throwDemo(ExceptionDemo01.java:13) at exceptionDemo.ExceptionDemo01.main(ExceptionDemo01.java:7) 

 

 

 

三、用throws还是try… catch...

对于编译时异常到底是用try…catch…还是throws,其实都是可以的。这就相当于BOSS给你一个任务,如果自己能够独立解决就try…catch…,如果解决不了,就需要将问题抛给上一层,直到可以解决这个问题为止,最终没有处理的异常JVM会处理。

在选择的时候可以有以下几点考虑:

1、  将能处理的异常在本方法内就用try…catch…捕获,实在不能解决的异常再throws抛给调用者多层调用的话可能将问题复杂化。

2、  如果希望出现异常的时候还能执行后面的程序则将异常try…catch…,如果希望出现异常时,程序就终止的话,就使用throws抛出异常。

   在上面一个例子中如果将t值设为正数,则程序会继续执行,

运行结果显示为:

 

 

可执行后面的程序!

 

 

 

最后引用几则异常处理的原则和技巧:

写道
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。

 

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
内容概要:本文档介绍了一种基于ADP5070 DC-DC开关稳压器、ADP7142和ADP7182 CMOS LDO线性稳压器、LC滤波器及电阻分压器的电路设计方案,旨在为仅拥有5 V单电源的系统提供低噪声、双电源解决方案,以支持AD5761R双极性DAC的工作。AD5761R是一款16位双极性DAC,需要双电源来提供双极性输出电压范围。文中详细描述了如何配置该电路以适应单电源系统的应用,并展示了不同电源配置(包括外部电源、ADP5070和LC滤波器、ADP5070和LDO线性稳压器)下的性能测试结果,特别是频谱分析、输出电压噪声和交流性能等方面的数据。测试结果表明,增加LDO线性稳压器可以显著降低输出噪声,提升整体性能。 适合人群:从事精密仪器设计、数据采集系统开发的技术人员,尤其是那些需要理解和应用低噪声电源解决方案的专业人士。 使用场景及目标:适用于需要从单一5 V电源生成双电源的应用场合,如测试与测量设备、数据采集系统、执行器控制系统和工业自动化等领域。主要目标是在保证低噪声的前提下,确保AD5761R DAC能够在单电源环境中正常工作,提供高质量的双极性输出。 其他说明:本文档不仅提供了详细的电路配置指南,还通过大量的图表和数据分析验证了不同电源配置的效果。特别强调了在不同频率范围内,使用内部基准电压源和外部基准电压源(如ADR4525)对DAC输出噪声的影响。此外,文档还讨论了LC滤波器和LDO线性稳压器在减少开关纹波方面的作用,为实际应用提供了有价值的参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值