异常处理的实际上就是:
有风险的行为(方法)可能会将异常抛出(throws)。调用该方法的程序会尝试(try)去运行,运行的同时捕捉(catch)异常。
简而言之,就是对有风险的行为进行处理。
有风险的行为:
与程序代码上出现的逻辑问题不同(比如你对一个只有5项元素的数组取第8个元素的值),有风险的行为是指你无法保证在执行期不会出现的(例如某些文件会正确的待在某个特定的目录中,当实际执行时文件却又失踪了)。
为什么要做异常处理:
让编译器确定你了解所调用的方法是有风险的,并也准备好用try和catch来处理它。如果对有风险的行为不进行异常状况处理则无法通过编译。
自定义异常:
我们知道,异常也不过只是一种Exception类型的对象,只不过它能够被抛出(throws/throw)和捕捉(catch)。因此,要自定义异常只需要继承Exception这个类。
所有的异常都是Exception的子类,就像java中所有的类都是Object的子类一样。
package a0304;public class task {void doRisky(int num)throws numException{ //有风险的行为if (num>5) {System.out.print("start throw\n");throw new numException(); //可能抛出的异常}System.out.print("throw 以后不会往下运行,直接跳转到catch\n");}public static void main(String[] args) {task t1 = new task();try { //尝试运行程序,如果捕捉到异常则直接跳转到catchSystem.out.print("start try\n");t1.doRisky(6);System.out.print("end try\n");}catch(numException a){System.out.print("start catch\n");a.printStackTrace(); //对应第40行代码System.out.print("end catch\n");}System.out.print("enddddddddddddddd!");}
}//自定义异常类
class numException extends Exception{/*** */private static final long serialVersionUID = 1L;numException() {super("数字异常!!!");}
}
运行结果:
如果把19行中 t1.doRisky(6); 改为 t1.doRisky(4);运行结果如下: