Java中的常见异常

来源:互联网 发布:python mysql 批处理 编辑:程序博客网 时间:2024/05/16 09:43

Java提供了异常处理机制来帮助程序员检查可能出现的错误,保证了程序的可读性和可维护性。下面将介绍Java中的常见异常和自定义异常。

Java中的常见异常

异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。下面来看个例子:

public class Test {    public static void main(String[] args) {    //主函数        String str="Z.y";                   //定义一个字符串变量        System.out.print(str+"年龄是:");    //输出字符串变量        int age=Integer.parseInt("22L");   //数值型字符串转换成整型        /*Integer类的parseInt()方法可以将字符串转换为整型,但是若字符串不是数值型         * 则会报错!!         */        System.out.println(age);           //输出age   }}

由于22L并非数值型的字符串,所以系统会抛出错误,跑出了如下的错误:

   Z.y年龄是:Exception in thread "main" java.lang.NumberFormatException: For input string: "22L"    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)    at java.lang.Integer.parseInt(Integer.java:580)    at java.lang.Integer.parseInt(Integer.java:615)    at Test.main(Test.java:6)

NumberFormatException就是我们经常会遇见的异常之一,Z.y年龄是已经输出,可知第一个输出之前都正确。第一个输出到第二个输出之间发生了错误。因此第二次输出中的age并没有输出。对与这类错误,我们可以进行捕捉异常,异常的捕捉通常以try…catch…finally….语句块构成。其中try…语句块是可能发生异常的Java语句;catch…语句块在try语句块之后,作用是激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行语句块finally。对上面的异常进行捕获:

public class Test {              //定义Test类    public static void main(String[] args) {       //主函数        try{                                       //可能发生异常的代码块            String str="Z.y";                      //定义字符串变量            System.out.print(str+"年龄是:");        //输出字符串            int age=Integer.parseInt("22L");        //数值型字符串转换成整型            /*Integer类的parseInt()方法可以将字符串转换为整型,但是若字符串不是数值型             * 则会报错!!             */            System.out.println(age);                //输出整型变量        }catch(Exception e){                        //激发异常            e.printStackTrace();                    //异常性质        }        System.out.println("Program Over");    }}

运行结果如下所示:

Z.y年龄是:java.lang.NumberFormatException: For input string: "22L"    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)    at java.lang.Integer.parseInt(Integer.java:580)    at java.lang.Integer.parseInt(Integer.java:615)    at Test.main(Test.java:7)Program Over

从输出结果来看,虽然在输出Program Over之前已经出现了异常,但是并不影响Program Over的输出,没有因为异常而终止程序。当try语句块里语句发生异常,就会转到catch语句;执行完catch后,将继续执行catch后的代码,这就是捕获异常的好处。完整的异常处理语句一定要包含finally语句,无论程序中是否会有异常发生, 亦或者代码块try-catch有无顺利执行完毕,都会执行finally语句块。除了以下四种情况:

(1)finally语句块发生异常;

(2)前面代码使用了System.exit()退出程序;

(3)程序所在的线程死亡;

(4)关闭CPU;

Java中一些常见的异常,比如ArithmeticException、NumberFormatException等等,具体的可以参照Java常见异常,最详细的资料需要参考JDK的API文档,具体的不在此赘述。

自定义异常类

下面我们来谈一谈Java中自定义异常的使用。使用Java内置的异常类可以描述在编程时的大部分异常情况。我们还可以继承异常类来定义自己的异常类。自定义异常类的步骤一般是:

(1)创建自己的异常类;

(2)在方法中通过throw关键字抛出异常对象;

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理。否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常;

(4)再出现异常的地方捕获并处理异常;

看一下具体的代码实现:

一、首先我们定义自己的异常类

public class MyException extends Exception {         //创建自定义异常,继承Exception类    /**  * 自定义异常类     */    private static final long serialVersionUID = 6881659454297603792L;public MyException(String ErrorMessage){  //构造方法        super(ErrorMessage);              //父类构造方法}}

二、字符串ErrorMessage是要输出的错误信息。下面抛出自定义的异常:

 public class Tran {                                                //创建类    static float avg(int number1,int number2)throws MyException{   //定义方法拋出异常        if(number1<0||number2<0){                                  //判断方法中参数是否满足指定条件            throw new MyException("不可以使用负数");                //错误信息        }        if(number1>100||number2>100){                              //判断方法中参数是否满足指定条件            throw new MyException("数值太大了");                    //错误信息        }        return(number1+number2)/2;                                 //返回两数的平均值    }    public static void main(String[] args) {                       //主方法        try{                                                       //try代码块处理可能出现的异常            float result=avg(45, 120);                             //调用方法            System.out.println(result);                            //输出结果        }catch(MyException e){                                     System.out.println(e);                                 //输出异常信息        }    }}

运行结果如下:

MyException: 数值太大了

下面再看一个完整的例子:

package Exception2;                                   //定义Exception2包public class MyException extends Exception{           //自定义异常类,继承Exception    /**     * 自定义异常类     */    private static final long serialVersionUID = 1998797862547839622L;    String message;                                  //定义字符串    public MyException(String ErrorMessage){         //构造函数        message=ErrorMessage;                        //将错误的信息赋值给message    }     public String getMessage(){                      //重写getMessage方法        return message;                              //返回错误的信息    }}package Exception2;                                           //定义Exception2包public class Captor {                                        //Captor类    static float quotient(int x,int y)throws MyException{    //quotient方法抛出异常        if(y<0){                                             //异常情况            throw new MyException("除数不能是负数");          //错误信息        }        return x/y;                                          //返回x/y    }    public static void main(String[] args) {                 //主函数        try{                                                 //可能出现异常的代码块            float result=quotient(4, -1);             System.out.println(result);        }catch (MyException e){                              //发生自定义异常            System.out.println(e.getMessage());              //错误信息        }catch (ArithmeticException e){                      //发生算术异常            System.out.println("除数不能为零");               //错误信息        }catch (Exception e){                                //其他异常            System.out.println("程序发生了其他异常");         //错误信息        }    }}

运行结果如下:

除数不能是负数
原创粉丝点击