异常处理:
在写Java程序时,异常处理是比较重要的地方,所以刚刚参考书中的相关章节,把异常处理的知识系统整理了一下。
一)异常的产生:
1)在程序运行时由 Java 虚拟机创建和抛出的异常
2)在 Java 类库的函数中创建和抛出的异常
3)程序员自己的函数中创建和抛出的异常
二)抛出异常:
异常的抛出需要 throw 关键字。在定义一个函数时,如果在这个函数内部可能会抛出某种类型的异常,那么要在函数名的后面用 throws 关键词声明一下。
异常其实就是类的对象,因此可以自己定义异常类。
例如:
public class NotEnoughMoney extends Exception{
//定义了一个异常类
public NotEnoughMoney(){}
public NotEnoughMoney(String msg){
super(msg);
}
}
异常的抛出:
public static void GetMoney(int money) throws NotEnoughMoney{
...
if(money>my_money)
throw NotEnoughMoney(); //抛出异常
...
}
如果在定义一个函数时,声明它可能会抛出异常,就像 GetMoney(int money),那么对用调用该函数的代码来说,就必须对这个异常进行处理,否则就会编译出错。处理的方法主要有两种:
1)使用 try....catch...... 结构来捕获
public static void BuyStuff()
{
try{
GetMoney(200); //调用了函数GetMoney(),该函数可能会抛出异常
System.out.println("done\n");
}catch(NotEnoughMoney e){
System.out.println("error: don't have enough money!\n");
}
}
2)不进行任何处理,重新声明抛出
public static void BuyStuff() throws NotEnoughMoney{
GetMoney(200);
//调用了GetMoney()函数,该函数可能会抛出异常,在调用BuyStuff()函数的代码中重新抛出
System.out.println("done!\n");
}
对于 try....catch...... 结构,好比是当前函数就能够拍板拿主意,所以就直接处理了;而对于 throw,好比是当前函数拿不定主意,不知如何处理,所以就把问题上报了。
三)异常的类型
1)非检查型异常
系统不要求程序捕获的异常,如数组越界、除零等,编译器在编译时不会进行检查,但在运行时,如果出现了这些情形,就会产生相应的异常。(RuntimeException及其子类)
2)检查型异常
程序必须对这种异常进行处理,要么捕获,要么抛出,否则就无法编译通过。
如 Exception, ClassNotFoundException, IOException, FileNotFoundException, EOFException