Java异常处理

本文详细介绍了Java中的异常处理机制,包括异常的分类,如Error和Exception,以及如何通过try-catch-finally进行异常捕获和处理。此外,还讲解了throw和throws的区别,自定义异常的创建,以及异常链的概念。示例代码展示了如何处理ArithmeticException和InputMismatchException,并提供了异常处理的最佳实践。
摘要由CSDN通过智能技术生成

提示:文章如若有不正确的内容,欢迎大家指正


前言

提示:
本文档主要记录Java异常的相关内容


提示:以下是本篇文章正文内容

一、什么是异常?

异常即意外、例外
本质上说就是程序上的错误,包括编译期间和运行期间的错误
总的来说,在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常

(一)异常分类

异常是通过Throwable类以及他的相关子类进行描述的
Throwable是java中异常的根类,它有两个重要的子类,一个是Error类,一个是Exception类

Error是程序无法处理的错误,表示运行应用程序中较严重问题

常见的错误有:VirtualMachineError(虚拟机错误)、OutOfMemoryError(内存溢出)、ThreadDeath(线程死锁)

Exception是程序本身可以处理的异常,异常处理通常指针对这种类型异常的处理

又分:Unchecked Exception(非检查异常)、Checked Exception(检查异常)
非检查异常主要就是RuntimeException分为四类:
NullPointerException(空指针异常)
ArrayIndexOutOfBoundsException(数组下标越界异常)
ArithmeticException(算术异常)
ClassCastException(类型转换异常)
编译器不会对非检查异常产生任何信息的,可以捕获处理,也可以放任不管
检查异常很多,例如两类:
IOException(IO异常)
SQLException(SQL异常)
编译器必须处置的异常

二、如何处理异常?

(一)try-catch-finally

try块:用于捕获异常
catch块:用于处理try捕获到的异常
finally块:无论是否发生异常代码总能执行的代码块
try快后可以接0或多个catch块,如果没有catch块,必须跟一个finally块

public class TryDemoOne {

	public static void main(String[] args) {
		// 要求:定义两个整数,输出两数之商
	/*
		int one=12;
		int two=2;
		System.out.println("one和two的商是:"+(one/two));
	*/
		Scanner input=new Scanner(System.in);
		System.out.println("=====运算开始=====");
		try {
		System.out.print("请输入第一个整数:");
		int one=input.nextInt();
		System.out.print("请输入第二个整数:");
		int two=input.nextInt();
		System.out.println("one和two的商是:"+(one/two));
		}catch(ArithmeticException e) {
			System.exit(1);//终止程序运行
			System.out.println("除数不允许为零");
			e.printStackTrace();
		}catch(InputMismatchException e) {
			System.out.println("请输入整数");
			e.printStackTrace();
		}catch(Exception e) {
			System.out.println("程序出错啦~~~~");
			e.printStackTrace();
		}finally {
			System.out.println("=====运算结束=====");
		}
		/*
		 * ArithmeticException
		 * 数字运算异常
		 * 涉及到数字运算的地方可能出现的失误,比如程序中出现了除以 零 这样的运算
		 */
		
		/*
		 * NumberFormatException
		 * 数字格式化异常
		 * 涉及到类型转换时,比如不符合转换格式的字符串被转化成数字
		 */
		
		/*
		 * ArrayIndexOutOfBoundsException
		 * 数组下标越界异常
		 * 涉及到使用数组下标范围的下标
		 */
		
		/*
		 * NullPointerException
		 * 空指针异常
		 * 当使用了未经初始化的对象或者是不存在的对象时
		 */
		
		/*
		 * ClassCastException
		 * 类型转换异常
		 * 进行向下转型时,转换对象无法完成正常的转换
		 */
		
		/*
		 * ArrayStoreException
		 * 数组中包含不兼容的值的异常
		 * 数组中实际传入的数据与预定不符,比如子类数组经过向上转型后,传入父类的对象
		 */		 
		
		/*
		 * InputMismatchException
		 * 输入格式错误的异常
		 * 接收数据与预期格式不符时
		 */
		
		/*
		 * FileNotFoundException
		 * 文件未找到异常
		 * 操作文件内容时发现文件不存在
		 */
		

关于try-catch中的一些问题:

1.try-catch里面定义的变量外部是不可以使用的,是局部变量
2.尽可能的使用Exception的子类进行异常处理,而不是Exception类,可以增强程序的课扩展性和维护性
3.ArithmeticException是属于java.lang包的,系统默认加载的,不需要导入操作;InputMismatchException是java.util包的,需要导入包
4.使用多重catch块应处理范围,大范围的(类)应该在后面,小范围的应该在前面
5.异常输出的位置只与产生异常的位置有关

return返回值

之前我们学习的如果方法返回值为void,return后无需加返回值,直接分号结束;通过return返回值可以结束当前方法执行将返回值带回调用处。
return语句如果在try-catch-finally块中,由于finally语句块一定要执行,所以当存在finally时,会先执行完finally中的代码在执行return

System.exit(参数)

终止当前运行的Java虚拟机,非零状态码表示异常终止

(二)throw 和 throws

可以通过throws声明将要抛出的异常类型,通过throw将产生异常的抛出

public class TryDemoSeven {
	public static void main(String[] args) {
		try {
			int result=test();
			System.out.println("one和two的商是:"+result);
		} catch (ArithmeticException e) {
			// TODO Auto-generated catch block
			System.out.println("除数不允许为零");
			e.printStackTrace();
		}catch(InputMismatchException e) {
			System.out.println("请输入整数");
			e.printStackTrace();
		}
	}

	public static int test() throws ArithmeticException,InputMismatchException{
		Scanner input=new Scanner(System.in);
		System.out.println("=====运算开始=====");
		System.out.print("请输入第一个整数:");
		int one=input.nextInt();
		System.out.print("请输入第二个整数:");
		int two=input.nextInt();
		System.out.println("=====运算结束=====");
		return one/two;
	}
}

通过throws抛出异常时,针对可能出现的多种异常情况,解决方案:

1、throws后面接多个异常类型,中间用逗号分隔
2、throws后面接Exception,注意存在检查异常类

public class TryDemoeight {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			setAge();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	//描述酒店的入住规则:限定年龄,18岁以下,80岁以上的住客必须由亲友陪同
	public static void getAge() {
		try {
			System.out.println("请输入年龄:");
			Scanner sc=new Scanner(System.in);
			int age=sc.nextInt();
			if(age<18 || age>80) {
				throw new Exception("限定年龄,18岁以下,80岁以上的住客必须由亲友陪同");
			}else
				System.out.println("欢迎来到本酒店");
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	
	public static void setAge() throws Exception{
			System.out.println("请输入年龄:");
			Scanner sc=new Scanner(System.in);
			int age=sc.nextInt();
			if(age<18 || age>80) {
				throw new Exception("限定年龄,18岁以下,80岁以上的住客必须由亲友陪同");
			}else
				System.out.println("欢迎来到本酒店");
	}

}

throw抛出异常对象的处理方案:

1、通过try…catch包含throw语句–自己抛出自己处理
2、通过 throws在方法声明中抛出异常类型–调用者可以自己处理,也可以继续上抛
3、此时可以抛出与throw对象相同的类型或者其父类

throw 与 throws 区别

throw 在方法体抛出异常,且一个
throw 异常对象; 或 throw new 异常类型(参数列表);
throw抛出的是CheckedException对象,且未进行任何处理,会编译失败;UnCheckedException对象,默认不会产生错误提醒
throw和return都会触发中断方法操作,未加入判断的情况,不可同时出现

throws 在方法的参数列表后,可以跟着多个异常类型名

(三)自定义异常

关于自定义异常中的一些问题:

1.自定义异常属于检查异常还是非检查异常要看自定义的时候所继承的父类的类型,跟父类一样
2.getMessage():获取异常描述信息
toString():获得异常类型和描述信息,当直接输出对象时,默认调用该方法
printStackTrace():打印异常产生的堆栈信息,包括种类、描述信息、出错位置等
3.自定义异常需先经过throw抛出,才能被catch捕获,是无法自动被程序捕获并处理的

(四)异常链

1.我们可以借用在异常的根类Throw中提供的带参构造方法Throwable(String message,throwable cause)以及初始化方法Cause(Throwable cause)实现异常链信息的传递
2.信息展示时,以最终调用执行的方法为主体,逐步展示其包含的异常信息,直至最底层方法的异常信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值