Java基础18 异常

为热爱编程的你点赞!
学习SpringBoot实战课程 https://edu.csdn.net/course/detail/31433
学习SpringCloud入门课程 https://edu.csdn.net/course/detail/31451


前言

本文我们来了解Java中的异常处理机制。

什么是异常

程序运行时出现的错误,一旦出现了异常,就必须进行处理,如果不处理程序会中断执行

异常体系结构

在这里插入图片描述
Throwable是异常和错误的父类,代表可以由JVM产生并抛出。
Throwable的子类:

  • Exception 异常
    异常出现后程序可以进行处理,处理后程序可以正常执行
  • Error 错误
    一般是系统级别的错误,如StackOverflow栈溢出和OutOfMemoryError内存溢出,出现后不能进行处理,只能修改代码避免出现。

异常的分类

  • 非受检异常 Unchecked Exception
    RuntimeException及其子类,程序不强制要求处理
  • 受检异常 Checked Exception
    非RuntimeException异常,程序强制要求处理

常见异常

类名 异常
NullPointerException 空指针异常
ClassCastException 类型转换异常
ArrayIndexOutOfBoundsException 数组下标越界异常
StringIndexOutOfBoundsException 字符串下标越界异常
NumberFormatException 数字格式异常
InputMismatchException 输入格式异常
IllegalArgumentException 错误的参数异常
ArithmeticException 算术异常
ParseException 日期解析异常
SQLException 数据库异常
IOException 输入输出异常
ClassNotFoundException 类找不到异常

try-catch异常处理

异常被处理后,程序可以正常运行
语法:

try{
	可能出现异常的代码
}catch(异常类型 ex){
	处理异常的代码
}

异常处理过程:

  • 如果try中的代码出现了异常,JVM会自动抛出异常,程序跳转到catch中执行异常处理,处理结束后程序正常执行。
  • 如果try代码中没有异常,try代码执行完,跳过catch执行后面的代码。

异常的常用方法
Exception的方法:

方法名 作用
void printStackTrace() 打印堆栈信息
String getMessage() 获得异常信息
Throwable getCause() 获得上一级异常

多重catch异常处理

语法:

try{
	可能出现异常的代码
}catch(异常类型1 ex){
	处理代码1;
}catch(异常类型2 ex){
	处理代码2;
}...

异常处理过程:

  • 一旦出现异常,把异常和每个catch块进行匹配,如果匹配成功就执行catch后结束
  • 如果不匹配再判断下一个catch的异常类型。
    注意:如果catch中出现其他异常的父类,父类异常必须放在最后

try-catch-finally异常处理

finally最终的,在finally中的代码无论如何都会执行
程序有部分代码,是必须执行,如:数据库连接关闭、文件流关闭、网络连接的关闭

try{
	可能出现异常的代码
}catch(异常类型 ex){
	异常处理
}finally{
	如论如何都执行的代码
}

异常处理过程:

  • 如果try出现异常,跳转到catch执行处理,最后执行finally代码;
  • 如果try没有异常,try执行完,最后执行finally。

try-catch-finally案例

Scanner input = new Scanner(System.in);
try{
	System.out.println("输入一个数:");
	int num1 = input.nextInt();
	System.out.println("输入一个数:");
	int num2 = input.nextInt();
	int result = num1 / num2;
	System.out.println("result = " + result);
}catch(ArithmeticException ex){
	System.out.println("出现了算术异常");
	ex.printStackTrace();
}catch(InputMismatchException ex){
	System.out.println("出现了输入格式异常");
	ex.printStackTrace();
}catch(Exception ex){
	ex.printStackTrace();
}finally{
	System.out.println("最终执行的代码");
}
System.out.println("程序执行完毕~~~");

throws 和 throw关键字

throws关键字
用于方法声明异常,一旦方法声明异常,方法中可以不处理异常,由方法的调用者处理。
一般用于非运行时异常。
语法:

public 返回值类型 方法名(参数列表) throws 异常类型1, 异常类型2...{

}

throw关键字
用于手动抛出异常,给调用者进行提示
语法:

if(条件){
	throw new 异常类型("异常描述信息");
}

练习:输入一个人的年龄,年龄必须在0~100之间,如果超过就抛出IllegalArgumentException异常

/**
 * 输入年龄
 * @throws IllegalArgumentException
 */
static void inputAge() throws IllegalArgumentException{
	Scanner input = new Scanner(System.in);
	System.out.println("输入年龄(0~100)");
	int age = input.nextInt();
	//手动抛出异常
	if(age < 0 || age > 100){
		throw new IllegalArgumentException("年龄必须在0到100之间");
	}
	System.out.println("年龄是"+age);
}

public static void main(String[] args) {
	try{
		inputAge();
	}catch(IllegalArgumentException ex){
		ex.printStackTrace();
	}
}

自定义异常

在某些特定业务需求下,系统中的异常不能很好处理或表示该业务的问题,可以自定义异常类解决特定业务问题。
如:银行账户取钱时,要判断余额是否足够
实现步骤:
1)定义类继承Exception或其子类
2)满足某些条件时,在方法中用throw抛出异常
3)在声明方法时,用throws声明异常
4)调用方法时,使用try-catch处理异常

/**
 * 余额不足异常
 * @author xray
 *
 */
public class BalanceException extends Exception{

	public BalanceException(String msg){
		//将异常描述信息传给父类
		super(msg);
	}
}
/**
 * 银行账户类
 * @author xray
 *
 */
public class BankAccount {

	private String name;
	private int balance;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getBalance() {
		return balance;
	}
	public void setBalance(int balance) {
		this.balance = balance;
	}
	public BankAccount(String name, int balance) {
		super();
		this.name = name;
		this.balance = balance;
	}
	public BankAccount() {
		super();
	}
	/**
	 * 存钱
	 * @param money
	 */
	public void saveMoney(int money){
		this.balance += money;
		System.out.println("账户"+name+"的余额是"+balance);
	}
	/**
	 * 取钱
	 * @param money
	 * @throws BalanceException 
	 */
	public void takeMoney(int money) throws BalanceException{
		//如果余额不足,就抛出自定义异常
		if(balance < money){
			throw new BalanceException("对不起,您账户余额不足");
		}
		this.balance -= money;
		System.out.println("账户"+name+"的余额是"+balance);
	}
}
public class TestBank {

	@Test
	public void testBankAccount(){
		//创建银行账户
		BankAccount account = new BankAccount("恒哥",10000);
		account.saveMoney(1000);
		//处理异常
		try {
			account.takeMoney(10000);
		} catch (BalanceException e) {
			e.printStackTrace();
		}
	}
}

结束

作业:
定义学生类,定义姓名、年龄、性别属性和学习方法
定义一个方法,在方法中输入姓名、年龄、性别创建一个学生对象
性别输入错误,会抛出RuntimeException,并包含信息:性别必须是男或女
年龄输入错误,会抛出RuntimeException,并包含信息:年龄必须是18到30之间
用throws给方法声明RuntimeException异常
调用方法时,使用try-catch处理异常


大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总

猜你喜欢

转载自blog.csdn.net/u013343114/article/details/112676142