一:异常简介

二: 引言
先来一段较完整的程序段,因为这部分的知识比较碎,容易混乱,所以我们先整体了解一下。注意标红的字即可,没必要特别完完全全理解。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class StrtransferDate { public static void main(String[] args) throws ParseException { try{ String str="2016-06-06"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(str); //因为这里用到的类ParseException是系统自己的,所以尽管我们不显式的写出系统也会自动抛出。实际上是throw new ParseException(); //但是如果我们抛出自定义异常类的话,这句话一定不能省略。必须显式给出,原因也不难理解。 System.out.println(date); }catch (ParseException e){ e.printStackTrace(); } } }
三:几个关键词
(I)throw和throws的不同。
1.throw是切切实实的抛出具体的错误。
2.throws跟在函数声明的后面,表示下面的程序段中所有可能抛出的错误(正因如此,所以有s)
具体区别如下图所示:
(2)try-catch
1. try后面的中括号里面加上可能出错的代码以及抛出错误的代码语句。
2.catch(语句1){
语句2
} //catch可以有多个,因为try内可能抛出不同的异常类,因此catch也得有多个来承接//语句1主要是根据异常类建立一个对象供后面的{}使用,可以是自定义异常类,也可以是系统的本来就有的异常类
//语句2是catch捕捉到try抛出的异常后执行的语句。后面会详细介绍。
使用目的:在遇到运行时才能发现的错误时,try-catch后面的语句还可以执行,但是如果没有try-catch就jvm就直接退出程序了。而且有了try-catch可以方便我们快速定位修改代码错误。
(3)系统自带的异常类。
不需要自己手动抛出,我们只需了解三个对象函数即可。(这三个函数都是在catch里面用的)
1.getMessage() 2.toString() 3.printStackTrace();
//功能相似,都是打印错误信息的,区别就在信息的详细程度不一样。
示例:
public static void method(){
try{
int []arr={1,2,3};
System.out.println(arr[3]);
}
catch (ArrayIndexOutOfBoundsException e){
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
}
(4)自定义异常类。
在编写程序的时候可以扩展Exception类来定义我们自己的异常类。
自定义异常类继承自Exception,一定要写上继承的语句
那我们为什么要自定义异常类呢?
原因就在于对于一些我们自己编写的类,有时候错误很隐晦,语法上没错误,但是对于我们实际使用来讲,实际上是错误。就比如编写一个银行取钱的类,取钱的数字可以为正也可以为负,从语法角度上讲一点错误都没有,但是就我们实际生活而言,取钱的数字怎么可能有正又有负那?这时候为了符合实际情况,就需要自定义异常类。
就以上面的例子,我们编写一个实际程序:
//自定义异常类1,BankException,
//银行支出就是负数,存入钱就是整数,这个异常类的作用就是处理收入是负数和支出是整数的情况。
public class BankException extends Exception {
private String message;
public BankException(int m,int n){
message="入账资金"+m+"是负数或支出"+n+"是正数,不符合系统要求。";
}
public String Getmessage(){
return message;
}
}
//代表实际生活场景的类
public class Bank {
private int money;
Bank() {
}
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 = money + netIncome;
}
public int getMoney() {
return money;
}
}
//主类,负责执行代码
public class Test {
public static void main(String[] args) {
Bank bank=new Bank();
try{
bank.income(200,-100);
bank.income(-300,200);//出错后面的就不再执行了,直接退出
bank.income(300,-100);
} catch (BankException e) {
// 系统本来的错误输出函数还可以用,三选一即可,
// System.out.println(e.getMessage());
// System.out.println(e.toString());
// e.printStackTrace();
// 当然我们自定义的也可使用
System.out.println(e.Getmessage());
}
System.out.println("库里面现有"+bank.getMoney());
}
}
tip:根据Exception下面的子类分析总结得到,为了方便,我们都直接再异常类的构造函数中指定message这个字符串的值,这样外界通过 throw new 异常类名(参数) 这一句代码就能完成自定义异常类输出信息的组合,就例如上面程序段中的Bank类中的income函数中的throw new BankException(in, out);即完成了抛出,又完成了异常message的组合,方便后面的catch直接getMessage()捕捉输出。