异常类:程序运行时可能会出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误进行处理
(1)Java用throw关键字抛出Exception子类的实例表示异常发生。
(2)Java允许定义方法的时候声明该方法调用过程中可能出现的异常,即允许方法调用过程中抛出异常对象,终止当前方法的继续执行
//抛出异常
NumberFormatException(格式转换异常)
IOException(读取文件异常)
//异常对象可以调用以下方法得到或者输出有关异常的信息
public String getMessage();
public void printStackTrace();
public String toString();
7.3.1 try-catch 语句
Java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,一旦try部分抛出异常对象,或者调用某个可能抛出异常对象的方法,并且该方法抛出了异常,那么try部分立即结束执行,转向执行catch部分。
//try-catch语句格式
try{
包含可能发生异常的语句
}
catch(ExceptionSubClass1 e){
···
}
catch(ExceptionSubClassS2 e){
···
}
public class Example7_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=0;
int t=1000;
try {
// m=Integer.parseInt("8888");
n=Integer.parseInt("ab89");
// t =777;//t没有机会被赋值
}catch (NumberFormatException e) {
// TODO: handle exception
System.out.println("发生异常:"+e.getMessage());
}
}
}//输出结果:发生异常:For input string: "ab89"
7.3.2 自定义异常类
(1)在编写程序的时候可以扩展Exception类定义自己的异常类,然后根据程序的需求来规定哪些方法产生这样的异常
注意:throw和throws是不同两个关键字
//自定义异常类
public class Example7_5_BankException extends Exception {
/**
* 自定义异常类
* */
private static final long serialVersionUID = 446574521862455830L;
String message;
public Example7_5_BankException(int m, int n) {
message = "入账资金" + m + "是负数或者支出" + n + "是正数,不符合系统要求";
}
public String warnMess() {
return message;
}
}
public class Example7_5_Bank {
private int money;
public void income(int in, int out) throws Example7_5_BankException {
if (in <= 0 || out >= 0 || in + out <= 0) {
throw new Example7_5_BankException(in, out);// 方法抛出异常,导致方法结束
}
int netIncome = in + out;
System.out.printf("本次计算的纯收入是:%d元\n", netIncome);
money = money + netIncome;
}
public int getMoney() {
return money;
}
}
public class Example7_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Example7_5_Bank bank = new Example7_5_Bank();
try {
bank.income(200, -100);
bank.income(300, -100);
bank.income(400, -100);
System.out.printf("银行目前有%d元\n", bank.getMoney());
bank.income(200, -100);
bank.income(9999, -100);
} catch (Example7_5_BankException e) {
// TODO: handle exception
System.out.printf("计算收益过程中遇到如下问题:");
System.out.printf(e.warnMess());
System.out.printf("银行目前有%d元\n", bank.getMoney());
}
}
}
/*输出结果:
本次计算的纯收入是:100元
本次计算的纯收入是:200元
本次计算的纯收入是:300元
银行目前有600元
本次计算的纯收入是:100元
本次计算的纯收入是:9899元
*/