异常
异常是程序编译或运行时发生的意外情况
Exception 编译期异常,编译期必须处理
RuntimeException 运行时异常,不必须处理,可以通过调整代码来避免
Error 错误,内存溢出等都是错误,不能解决
异常的解决:
throws抛出异常,不解决,一旦发生程序会崩溃
try-catch捕获异常,解决异常,程序继续运行
```java
/**
* 测试编译期异常
*/
public class Demo01 {
public static void main(String[] args) {
//日期格式化类对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = new Date();
String s = sdf.format(date);//按照指定格式来格式化日期对象
System.out.println("s = " + s);
//解析字符串时,会抛出编译期异常:PaserException
try {//try块放的是可能会发生异常的代码
System.out.println(1);
Date date2 = sdf.parse("2022年07月12日");//抛出了异常?编译期异常
System.out.println(2);
System.out.println("date2 = " + date2);
} catch (ParseException e) {//一旦发生异常被catch语句捕获
System.out.println(3);
//e.printStackTrace();
} finally {//无论try语句是否发生异常,都会执行
System.out.println(4);
}
System.out.println(5);
System.out.println("-->程序执行结束..");
}
}
```
运行时异常
```java
String s1 = "";
System.out.println(s1.charAt(0));//运行时异常:StringIndexOutofBoundsException
```
自定义异常(1.继承Exception的编译期异常 2.继承RuntimeException的运行时异常)
```java
/**
* 测试ATM取款
*/
public class Test {
public static void main(String[] args) {
//创建取款机
ATM atm = new ATM();
//创建银行卡
BankCard bankCard = new BankCard();
bankCard.setBalance(5000);//设置卡内余额
//模拟ATM取款
atm.setBankCard(bankCard);//插卡
try {
atm.withdrawMoney();//取款功能
} catch (BalanceNotEnoughException e) {
e.printStackTrace();
}
System.out.println("-->程序运行结束");
}
}
/**
* 银行卡
* 余额
*/
class BankCard{
private double balance; //余额
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
/**
* ATM机
* 插卡
* 取款
*/
class ATM{
private BankCard bankCard; //ATM机卡槽
/**
* 取款的方法
*/
public void withdrawMoney() throws BalanceNotEnoughException {
System.out.println("--请输入取款金额:");
int money = new Scanner(System.in).nextInt();
//判断卡余额是否足够
if(money<=this.bankCard.getBalance()){
System.out.println("-->提示:取款成功!!");
this.bankCard.setBalance(this.bankCard.getBalance()-money);
System.out.println("-->提示:取款"+money+"元,卡内余额:"+this.bankCard.getBalance());
}else{
//抛出一个余额不足异常
//System.out.println("-->警告:余额不足");
throw new BalanceNotEnoughException();
}
}
public BankCard getBankCard() {
return bankCard;
}
//当作插卡
public void setBankCard(BankCard bankCard) {
this.bankCard = bankCard;
}
}
```
```
--请输入取款金额:
5001
cn.hp.demo04.BalanceNotEnoughException: 警告!!账号余额不足!!
at cn.hp.demo04.ATM.withdrawMoney(Test.java:64)
at cn.hp.demo04.Test.main(Test.java:22)
-->程序运行结束
```