Java中的常见异常

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("程序发生了其他异常");         //错误信息
        }
    }
}

运行结果如下:

除数不能是负数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值