为热爱编程的你点赞!
学习SpringBoot实战课程 https://edu.csdn.net/course/detail/31433
学习SpringCloud入门课程 https://edu.csdn.net/course/detail/31451
本文我们来了解Java中的异常处理机制。
程序运行时出现的错误,一旦出现了异常,就必须进行处理,如果不处理程序会中断执行
Throwable是异常和错误的父类,代表可以由JVM产生并抛出。
Throwable的子类:
异常的分类
类名 | 异常 |
---|---|
NullPointerException | 空指针异常 |
ClassCastException | 类型转换异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
StringIndexOutOfBoundsException | 字符串下标越界异常 |
NumberFormatException | 数字格式异常 |
InputMismatchException | 输入格式异常 |
IllegalArgumentException | 错误的参数异常 |
ArithmeticException | 算术异常 |
ParseException | 日期解析异常 |
SQLException | 数据库异常 |
IOException | 输入输出异常 |
ClassNotFoundException | 类找不到异常 |
异常被处理后,程序可以正常运行
语法:
try{
可能出现异常的代码
}catch(异常类型 ex){
处理异常的代码
}
异常处理过程:
异常的常用方法
Exception的方法:
方法名 | 作用 |
---|---|
void printStackTrace() | 打印堆栈信息 |
String getMessage() | 获得异常信息 |
Throwable getCause() | 获得上一级异常 |
语法:
try{
可能出现异常的代码
}catch(异常类型1 ex){
处理代码1;
}catch(异常类型2 ex){
处理代码2;
}...
异常处理过程:
finally最终的,在finally中的代码无论如何都会执行
程序有部分代码,是必须执行,如:数据库连接关闭、文件流关闭、网络连接的关闭
try{
可能出现异常的代码
}catch(异常类型 ex){
异常处理
}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关键字
用于方法声明异常,一旦方法声明异常,方法中可以不处理异常,由方法的调用者处理。
一般用于非运行时异常。
语法:
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知识点汇总