一、异常框架
二、异常详解
1、运行时异常
运行时异常全都继承于RuntimeException,所有的运行时异常都属于程序员编码问题,需要修改源码做前置条件判断,无需抛出。
(1)类型转换异常类
ClassCastException
毫不相关的接口引用之间转换是如果强转会发生编译不出错,运行时抛出该异常的情况。
(2)空指针异常类
NullPointerException
1、当变量为null是直接输出,不需要抛出异常。
2、当调用数值为null的对象成员方法时,触发该异常。
try {
String data = null;
System.out.println(data.equals(""));
} catch (NullPointerException e) {
e.printStackTrace();
}
(3)算数异常类
ArithmeticException
除数为零时抛出该异常。
try{
int p = 0/0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
(4)数组下标越界异常类
ArrayIndexOutOfBoundsException
try {
int[] dataArray = new int[3];
dataArray[3]++;
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
(5)字符串越界异常
StringIndexOutOfBoundsException
try{
String dataString = "贼子当道,再无大同";
System.out.println(dataString.charAt(9));
} catch(StringIndexOutOfBoundsException e){
e.printStackTrace();
}
2、编译异常
编译异常直接继承于Exception,经常放在try-catch里抛出异常
(1)文件找不到异常
指定路径实例化FileInputStream对象时需要抛出。
try {
FileInputStream fileInputStream=new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
(2)sql异常
建立jabc连接时需要抛出异常
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databaseName?useSSL=false&Timzone=UTC","***","***");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
3、错误
(1)虚拟机错误
(2)线程死锁
三、自定义异常训练
模拟银行转账,可以实现存钱和取钱的功能取钱时候如果余额不够就抛出异常 MeiQianException
//MeiQianException.java
public class MeiQianException extends RuntimeException{
public MeiQianException(){
super();
}
public MeiQianException(String s){
super(s);
}
}
//MyExceptionManageDemo.java
public class MyExceptionManageDemo {
public static boolean throwsMetQianException (double moneyNeed,double moneyHave) {
if(moneyHave <= 0){
throw new MeiQianException("You have not deposit in this bank card!");
} else if(moneyNeed > moneyHave) {
throw new MeiQianException("You have not enough deposit in this bank card!");
} else {
return true;
}
}
}
//BankCard.java
public class BankCard {
public double deposit;
public BankCard () {
this.deposit = 0;
}
public void outputDeposit(double moneyNeed) {
try {
boolean isEnoughMoney = MyExceptionManageDemo.throwsMetQianException(moneyNeed, deposit);
if(isEnoughMoney) {
deposit -= moneyNeed;
System.out.println("取款成功,账户余额:¥"+deposit);
} else {
System.out.println("服务异常");
}
} catch (MeiQianException e) {
e.printStackTrace();
}
}
public void inputDeposit(double money) {
deposit += money;
System.out.println("存款成功,账户余额:¥"+deposit);
}
}