首页 > 其他分享 >异常处理

异常处理

时间:2024-08-06 19:40:29浏览次数:6  
标签:语句 处理 抛出 try catch 异常 throws

异常概述

程序中的异常:

在Java语言中,异常是指程序在运行期间发生的事件,它是导致程序中断运行的正常指令流。

例如,在算术运算中除数为0、数组越界、空指针异常等,这些事件的发生都会阻止程序的正常运行。

*示例:**演示除法运算***

public class MathCalc {
	public static  int division(int dividend,int divisor){
		return  dividend/divisor;
	}
	public static void main(String[] args) {
		System.out.println(MathCalc.division(100, 0));
	}
}

异常分类:

1、Throwable类

位于异常类层次结构的顶端,它是Java中所有错误和异常的父类。

2、Error类

通常指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等。

这种错误无法恢复或不可能捕获,将导致应用程序中断。通常程序无法处理这些错误。

3、Exeception类

该类型的异常在程序中发生后可以进行捕获处理,处理后程序正常运行,从而保证程序的稳定性及健壮性。

Java程序开发中的异常处理,主要是针对Exception类及其子类进行的。

*示例:**演示数组下标越界异常***

public class RunException {
	 public static void showRuntimeException(){
		 int[] data=new int[2];
		 System.out.println(data[2]);
	 }
	 public static void main(String[] args) {
	          RunException.showRuntimeException();	
	 }
}

分析:

  • 上述程序的数组长度为2,数组中元素的索引范围为0~1,当程序取索引值1时,超出了索引的取值范围,从而产生了数组下标越界。
  • 由于没有进行异常处理,程序立即终止。
  • 该异常属于运行时异常,其特点是:程序编译时可通过,但运行时却发生异常。

*常见运行时异常**RuntimeException***

异常类名称 说明
ArithmeticException 算数异常
ArrayIndexOutOfBoundsException 数组索引为负或大于等于数组大小异常
ClassCastException 对象转换异常
IlleegalArgumentException 调用方法时传入非法参数异常
IndexOutOfBoundsExxception 数组索引越界异常
NegativeArraySizeException 数组长度为负值异常
NullPointerExcception 控指针指向异常
NumberFormatException 数字格式异常
StringIndexOutOfBoundsException 数字格式异常
UnsupportedOperationException 操作错误异常

常见检查时异常 CheckedException:

异常类名称 说明
ClassNotFoundException 找不到指定class异常
IOException IO操作异常
FileNotFoundException 文件不存在异常
SQLException SQL语句异常
InterruptedException 终端异常

try...catch处理异常

Java异常处理的作用和运行机制:

Java的异常处理机制可以保障程序具有良好的容错性,使程序健壮性更高。

当程序运行出现意外情形时,系统会自动生成一个Exception类型的子类对象来通知程序,从而实现业务功能的代码与错误处理代码分离,使程序具有更好的可读性。

Java的异常处理机制提供了两种方式来处理异常,一种是使用“try-catch”语句处理异常,另一种是在方法声明时使用throws关键字将异常抛出。

语法:

try{

	//可能出现异常的语句
}catch(异常类型1 异常对象1){
          //异常处理代码
}

示例:演示try-catch捕获异常

try{
	//创建Scanner对象,用于接收控制台输入的数据
	Scanner input=new Scanner(System.in);
	System.out.println("请输一个整数除数:");
	int num=input.nextInt();
	System.out.println("您输入的数字是:"+num);
}catch(InputMismatchException e){
	System.err.println("输入不匹配异常:程序只能接收整数");
}

注意:

一个try块可以对应多个catch块,构成多重catch语句块,多重catch语句块用于对多个不同的 异常类型进行捕获,但最多只能选中一个执行。

先处理小异常,再处理大异常。即进行异常捕获时不仅应该将Exception类对应的catch块放在最后,而且所有父类异常的catch 块都应该放在子类异常catch块的后面,否则将出现编译错误。

示例:演示多重catch语句块

try{
	Scanner input=new Scanner(System.in);
	System.out.println("请输入被除数:");
	int divisor=input.nextInt();
	System.out.println("请输出除数:");
	int dividend=input.nextInt();
	System.out.println("您输入的两个数的是:"+divisor/dividend);
}catch(InputMismatchException e){
	System.err.println("输入不匹配异常:程序只能接收整数");
}
catch (ArithmeticException e) {
	System.err.println("算数异常:0不能作为被除数");
}catch(Exception e){
	System.err.println("未知异常");
}	

使用finally回收资源:

*语法:*

try{
	//可能出现异常的语句
}catch(异常类型1 异常对象1){
          //异常处理代码
} finally{
  //资源回收代码
}

说明:

finally块保证回收在try块中打开的物理资源,如数据库连接、网络连接或磁盘文件等。

无论try语句块中的代码是否出现异常,try语句块对应的任意一个catch语句块是否被执行,甚至在try或catch语句块中执行了return语句,finally块总会被执行。

无论是try语句块还是catch语句块中使用return语句,都要先执行完finally语句块后,再返回当前方法。

try语句不能独立存在,其后至少要有一个catch语句块或finally语句块。

finally语句块不是必须存在的,可以根据需求决定是否添加。

throw与throws

throw与throws

Java 强烈要求应用程序进行完整的异常处理。

throws用来声明一个方法可能抛出的所有异常信息。通常不用显示地捕获异常,系统将自动将异常抛给上级方法,throws出现在方法的头部。

throw指程序运行中抛出的一个具体的异常Exception,抛出的Exception需要用户来捕获处理。

*语法:*

[访问控制符]  返回类型  方法名称([参数列表])  throws  异常类1,  异常类2…
{
}

当前方法不知道如何处理当前异常时,可以使用throws关键字声明抛出异常,该异常可由上一级调用者处理。

throws声明只能在方法签名中使用。

throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。

使用throws声明并抛出异常:

public class Read {
	//使用throws抛出程序可能发生的异常类,可由调用该方法处捕获处理
	public static void readFile() throws ClassNotFoundException,FileNotFoundException{
		//将com.java.Read类加载到JVM的内存中
		Class.forName("com.java.Read");
		//创建FileInputStream实例,用于读取文件中的数据
		FileInputStream  fis=new FileInputStream("c://file.txt");
	}
	public static void main(String[] args) {
		try {
			Read.readFile();
		} catch (FileNotFoundException e) {
			e.printStackTrace();//显示堆栈异常信息
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

如果在main()方法中未使用try-catch捕获readFile()方法抛出的异常,而是在main()中继续将异常抛出,此时该异常交给JVM虚拟机进行处理。

不提倡开发人员在main()中将异常继续向上抛给JVM。

使用throw抛出异常:

语法:

throw  异常类对象

在实际的企业项目开发中,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据处理与指定的业务需求不符,这就是一种异常。

与业务需求不符而产生的异常,必须由开发人员来决定抛出,系统无法抛出这种异常。

如果需要在程序中自行抛出异常,则应该使用throw语句。

throw语句抛出的不是一个异常类,而是一个异常实例,且每次只能抛出一个异常实例。

public class UserInfo {
	private String name;
	private int age;
	...
	public void setAge(int age) throws Exception {
		if(age<18 || age>60){
			//使用throw抛出异常
			throw new Exception("员工年龄应该在18岁至60岁之间");
		}
		this.age = age;
	}
	...
	public static void main(String[] args) {
		UserInfo userInfo=new UserInfo();
		userInfo.setName("俞敏红"); //姓名赋值
		try {
			userInfo.setAge(10);  //年龄赋值  
		    userInfo.showEmpInfo(); //显示员工信息
		} catch (Exception e) {
			e.printStackTrace(); 
		}
	}
}

*throws**和**throw**的区别***

throws throw
声明一个方法可能抛出的所有异常类型 抛出一个具体的异常类实例
不用显式地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法(即方法的调用者) 需要程序员自行捕获相关的异常
throws在方法头声明 throw在方法内部使用

标签:语句,处理,抛出,try,catch,异常,throws
From: https://www.cnblogs.com/chenlei210162701002/p/18345855

相关文章

  • python 音频处理(2)——提取PPG特征之whisper库的使用(2.1)
    提取PPG特征之——whisper库的使用(2.1)1安装对应的包方法一(自用):直接pip即可:pipinstallopenai-whisper成功后如下图所示方法二:当时用了他这个方法环境直接崩了,已老实condainstall-cconda-forgeffmpegcondainstall-cconda-forgepoetrypoetryinitpoetry......
  • 【技术积累】如何处理Feign的超时问题
    在使用Feign进行微服务之间的通信时,由于网络延迟等原因,可能会出现请求超时的情况。为了解决这个问题,我们可以对Feign进行配置,设置超时时间。配置Feign的超时时间在使用Feign时,我们可以通过配置来设置请求的超时时间。具体地,我们可以在应用程序的配置文件中添加以下属性:feign.c......
  • 【推荐100个unity插件之24】Post Processing 后处理插件最全基础使用说明
    文章目录前言什么是后处理?场景视图显示后处理效果主相机勾选渲染后处理Post-processVolume和Volume的区别内置渲染管线的后处理Post-processVolume使用通用渲染管线(URP)的后处理是Volume的使用文档升级URPglobalvolume全局后处理效果泛光(Bloom)色差(Chromatic......
  • Java包装类;字符串处理类:String;StringBuffer;StringBuilder;字符串处理类的常用方法;异常
    一,包装类      什么是包装类:         包装类是对于八种基本数据类型而言的,八种数据类型都有其对应的包装类。         以前定义变量,经常使用基本数据类型,对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器。  ......
  • 异常
    什么是异常在编程中,异常(Exception)是指程序运行过程中发生的不正常或非预期的行为,它可能由编程错误、硬件故障、用户操作不当或其他外部因素引起。异常处理是程序设计中非常重要的一部分,它允许程序在遇到错误时,能够优雅地处理错误情况,而不是直接崩溃或产生不可预测的行为。异常......
  • 高速图像采集卡设计原理图: 613-基于6UVPX C6678+XCVU9P的信号处理板卡
    基于6UVPXC6678+XCVU9P的信号处理板卡一、板卡概述      板卡基于6U VPX标准结构,包含一个C6678 DSP芯片,一个XCVU9P 高性能FPGA,双路HPC FMC。  二、处理板技术指标•  DSP处理器采用TI 8核处理器TMS320C6678;•  DSP 外挂一组64bit DDR3......
  • Windows bat批处理 新建一个日期时间文件夹 变日期和时间两个文件夹
    前言全局说明Windowsbat批处理新建一个日期时间文件夹变日期和时间两个文件夹一、说明环境:Windows11家庭版23H222631.3737二、错误的结果文件名:time_dir_Y-M-D_H-M_err.bat@echooff::获取当前日期,格式:20190909SETyear=%date:~0,4%SETmonth=%date:~5,......
  • 简单设计一个JAVA并行处理工具类
    在工作中,我们肯定遇到过一个接口要处理N多事项导致接口响应速度很慢的情况,通常我们会综合使用两种方式来提升接口响应速度优化查询SQL,提升查询效率开启多线程并发处理业务数据这里讨论第二种方案:使用多线程并发处理业务数据,最后处理完成以后,拼装起来返回给前端,每个人的实现方......
  • MATLAB在算法处理上的作用
    MATLAB在算法处理上的作用引言MATLAB(MatrixLaboratory)是由MathWorks公司开发的一种高性能语言及其交互环境,广泛应用于数学计算、算法开发、数据分析、仿真建模等领域。其强大的计算能力、丰富的工具箱和高效的可视化功能使其在算法处理方面表现出色。本文将详细探讨MATLAB在......
  • 异常的处理
    异常的处理只有两种方式抛出异常捕获异常抛出异常什么是抛出异常?目前为止任何异常,默认的处理方式都是抛出所谓抛出异常就是直接将错误信息打印到控制台怎么声明抛出异常?如果是运行时异常,不用处理,默认就会自动抛出如果是编译期异常,想要抛出异常,语法是位置:在方......