Java学习笔记(5)——异常

本文深入解析Java异常处理机制,包括异常分类、Throwable类结构、运行时异常与检查异常的区别,以及如何使用try-catch-finally结构进行异常捕获。同时,介绍了异常抛出、自定义异常和异常链的概念。

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

异常

  • 异常架构
    Throwable是所有异常的父类,下面分为两个主要的异常情况Error和Exception,Error异常一般情况下会造成程序的崩溃,使得程序无法进行。Exception异常分为运行异常(RuntimeException)和检查异常,运行异常包含空指针异常,数组下标越界异常,类型转换异常和算数异常等,这些异常属于编写程序的语法错误,可以被编辑器发现。检查异常主要是文件异常或SQL异常等,这些异常都需要被捕获处理。
Throwable
Error
Exception
虚拟机异常
VirtualMachineError
线程锁死
ThreadDeath
非检查异常
RuntimeException
检查异常
空指针异常
NullPointerException
数组下标越界异常
ArrayIndexOutOfBoundsExcpetion
类型转换异常
ClassCastException
算数异常
ArithmeticException
文件异常
IOException
SQL异常
SQLException
  • 异常处理
    主要用try-catch-finally结构块来捕获处理异常。在try结构中写入会出现异常的代码,在catch中进行捕获。

例:

try {
	//一些会抛出异常的方法
} catch(Exception e) {
	//捕获某项异常
} catch(Exception e) {
	//捕获某项异常
} finally {
	//最终要执行的方法
}

其中要注意的catch要按照从子到父的顺序来捕获异常,否则会产生编译错误。

  • 调用顺序:先执行try块中的代码,如果捕获异常,则执行catch中的代码,最后执行finally中的代码
  • 异常抛出
  1. throw:将产生的异常抛出
  2. throws:声明将要抛出何种类型的异常。例:
public float divide(int a, int b) throws Exception {
	if(b == 0)
		throw new Exception("除数不能为0");
	else
		return a/b;
}

当调用到会产生异常的函数时,有两种处理方式,一种是直接捕获异常进行处理,另一种是将异常继续抛出,再让上一级的调用者去处理该异常。

public void calculator(){
	//直接进行异常的捕获处理
	try {
		System.out.println(divide(5, 0));
	} catch(Exception e) {
		System.out.println(e.getMessage());
	}
}
public void calculator() throws Exception {
	System.out.println(divide(5, 0));
}
  • 自定义异常:可以通过创建一个类去继承相近的异常类,或直接继承异常的基类Exception。这样我们就可以在这个类中描述一个新的异常。
public class ClassName extends 异常类型{
	······
}
  • 异常链:用户可以在方法中抛出一个异常,去让调用这个方法的对象去捕获该异常,这样就能形成一条异常链。

例:

//定义一个查找失败的异常
public class FoundException extends Exception{
	public FoundException(String message){
		super(message);
	}

	public FoundException(){
		super();
	}
}
public class Initiation{
	public static void main(String arg[]){
		Initiation init = new Initiation();
		init.test2();
	}

	public void test1() throw FoundExption{
		throw new FoundExption("not found exception")
	}

	public void test2(){
		try {
			test1();
		} catch(FoundException e){
			RuntimeException rt = new RuntimeException("runtime exception");
			rt.initCause(e);
			throw rt;
		}
	}
}

运行后结果如下:

Exception in thread "main" java.lang.RuntimeException: run time exception.
	at com.java.exception.Initiation.test2(Initiation.java:20)
	at com.java.exception.Initiation.main(Initiation.java:8)
Caused by: com.java.exception.FoundException: not found message.
	at com.java.exception.Initiation.test1(Initiation.java:12)
	at com.java.exception.Initiation.test2(Initiation.java:17)
	... 1 more
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值