java异常处理

异常

         异常(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  捕捉异常对象。
                   //处理异常
             }
       }
}
原文地址:https://www.cnblogs.com/541wsy/p/12548218.html