Java基础18 异常

超详细的Java知识点路线图


前言

本文我们来了解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知识点汇总

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒哥~Bingo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值