异常
异常(Exception,例外):运行程序中出现的不正常现象,异常的前提是程序编译通过,运行时候才异常。通常常见于客户运行是的不正常的环境或操作产生。
为什么要处理异常:异常会导致出现不正常的反馈,或程序无条件的退出,从而导致某些工作无法回退。
怎样处理异常:开发阶段对于所有可能的异常情况进行先期检查,但通常上并不能完全考虑到。另一种处理方法是用面向对象的异常处理机制。具体下面会有。
常见的异常:异常类一般都是 Exception 的子类,类名以 Exception 结尾。如:NullPointerException,文档中有其出现的原因。一定要学会查看Java文档。
1、 ArithmeticException: 算术异常,如除数为0。
2、ArrayIndexOutOfBoundsException:数组越界异常。
3、ArrayStoreException:数组存储异常。
4、ClassCastException:类型转换异常。
5、 IllegalArgumentException:无效参数异常。
6、 NegativeArraySizeException:数组尺寸为负异常。
7、NullPointerException:未分配内存异常。
8、NumberFormatException:数字格式异常。
9、StringIndexOutOfBoundsException:字符串越界异常。
异常的就地捕获
异常的就地捕获(catch):当程序发生异常时,系统捕获异常,转而执行异常处理代码。
怎样进行就地捕获:分步实现
1、用 try 块将可能出现异常的代码包起来。
2、用 catch 块来捕获异常并处理异常。
3、如果有一些代码是不管异常是否出现都要运行的,用 finally 块将其包起来。
形式如下:
try{ /*可能出现异常的代码*/ } catch(可预见的 Exception1 ex1){ /*处理 1*/ } catch(可预见的 Exception2 ex2){ /*处理 2*/ } ... finally{ //可选 }
1、我们可以看到try后面接多个catch用来捕获多个异常。而如果有catch(Exception ex)则必须写在 catch 块的最后一个,代表前面无法处理的异常被这个块处理。
2、一个try后面必须至少接一个catch,可以不接finally,但是最多只能有一个finally。finally可以更大程度上保证程序的安全性。他可以让一段代码无论如何都能够执行。
异常的向前抛出
1、就地处理方法可以很方便地定义提示信息,对于一些比较简单的异常处理,可以选用这种方法。
2、向客户端传递的方法,其优势在于可以充分发挥客户端的能力,如果异常的处理依赖于客户端,或者某些处理过程在本地无法完成,就必须向客户端传递。
怎样向前抛出:1、将需要将异常向前抛出的函数加上一个标记:throws XXXException,表示可能向前抛出某种异常。举例:
public void fun() throws NullPointerException { //该函数如出现 NullPointerException,则向前抛出 } public void fun() throws NullPointerException, NumberFormatException{ //该函数如出现 NullPointerException或NumberFormatException,则向前抛出 } public void fun() throws Exception { //该函数如出现异常,则向前抛出 }
2、客户端可以就地处理,也可以继续抛出。
就地处理
public class Test1 { //该函数中如果出现异常,向前抛出 public static void add1() throws Exception{ //内容 } public static void main(String[] args) { //用 try 块将可能出现异常的代码包起来 try{ add1(); } //处理 NumberFormatException catch(NumberFormatException ex){ //处理异常 } //处理其他不可预见的异常 catch(Exception ex){ //处理其他异常 } finally{ System.out.println("程序运行完毕"); } } }
继续抛出:
public class Test2 { //该函数中如果出现异常,向前抛出 public static void add2() throws Exception{ //内容 } //main 函数将异常继续向前抛出(给控制台打印) public static void main(String[] args) throws Exception{ add2(); } }
自定义异常
为什么要自定义异常:给予异常更加丰富的功能。
如何自定义异常:1、建立一个自定义异常类,继承 Exception ,在里面封装需要封装的信息。
import java.util.Date; public class InputException extends Exception{ private Date date; public InputException (String message,Date date){ super(message); this.date = date; } public Date getDate(){ return this.date; } }
注:自定义异常类,并不是一定要继承 Exception,实际上继承 Exception 的子类也可以;另外还可以继承 java.lang.Throwable。只是继承 Exception 是我们最常用的做法。
2、在可能发生异常的函数后面添加 throws XXXException。
3、在可能抛出异常的函数内实例化异常对象,用throw关键字抛出。
4、在调用方用try-catch捕捉异常对象。
import java.util.Date; import javax.swing.JOptionPane; public class Test3 { //该函数中如果出现异常,向前抛出 public static void add3() throws InputException{//2.添加 try{ //内容 }catch(Exception ex){ InputException ie =new InputException(" 发生了异常",new Date()); //3.抛出该异常对象 throw ie; } } public static void main(String[] args) { try{ add3(); } //处理异常 catch(InputException ie){//4.在调用方用 try-catch 捕捉异常对象。 //处理异常 } } }