之前几节有相关代码的练习,但很显然,我们自己敲完代码,编译,运行,过程中会出现问题,Java编译会报错。
这节介绍java对这些问题的处理。
Java程序运行期间会出现错误,比如文件错误,网络错误,或者数据对象错误等。
java把异常当作对象处理。
继承自Throwable的Error和Exception。
Error是指运行期间严重错误,属于JVM层次的错误,不推荐捕获。
Exception表示可恢复的异常,编译器捕捉。分两类:
1.处理异常
在方法体中添加try-catch以及try-catch-finally
try{
//这边是一些会抛出异常的方法
}catch(Exception1 e){
//处理异常的代码块1
}catch(Exception2 e){
//处理异常的代码块2
}finally{
//最终要执行的代码
}
使用多个catch块捕获不同异常,注意Exception(是父类)位置在最后
e.printStackTrace();打印异常具体信息,或打印日志。
如果try、catch、finally中没有return语句,会执行他们之外的return。
例子:
2.异常抛出
throw将产生的异常抛出,写在方法体内;
throws声明将要抛出何种异常;
如果某个方法调用到了会抛出异常的方法那么必须添加try-catch尝试捕获异常,或者添加throws声明将异常抛出给更上一层调用者去处理。
3.自定义异常
Java中有很多异常类,我们可以用,也可以自定义自己的异常用于判断。
自定义的异常必须继承于java标准类库中意思相近的异常类型或直接继承Exception类。
class 自定义异常类名 extends 异常类型{……..}
4.异常链
把捕获的异常包装成新的异常,在新的异常里添加对原始异常的引用,再抛出新异常。
5.关于异常经验
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理;
- 在多重catch后面可以加一个catch处理可能会被遗漏的异常;
- 对于不确定代码,可以加上try-catch处理潜在异常;
- 尽量处理异常,切忌只是简单调用printStackTrace()打印输出,后期可以通过添加日志打印;
- 具体如何处理异常,要根据不同也无需求和异常类型决定;
- 尽量添加finally语句去释放占用的资源。
练习自定义异常
银行收入支出异常判定
a. 自定义一个银行异常类bankException,抛出warning()
public class BankException extends Exception {
String message;
public BankException(int m, int n) {//异常方法
message="入账资金"+m+"是负数"+n+"是正数不符合要求";
}
public String warning(){//异常信息输出
return message;
}
}
b. 在bank中写一个方法用来抛出异常
int money;
public void income(int in,int out)throws BankException{
if(in<=0||out>=0||in+out<=0){
throw new BankException(in,out);//抛出异常
}
int netIncome=in+out;//计算纯收入
System.out.printf("本次纯收入%d元\n",netIncome);
money+=netIncome;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
c. 测试类
public static void main(String[] args) {
Bank bank=new Bank();
try{bank.income(200, -100);
bank.income(300, -100);
System.out.printf("银行现有%d元\n",bank.money);
bank.income(300, 100);
}catch(BankException e){
System.out.println(e.warning());//打印异常
}
}
PS:支付宝搜“654656370”领红包。