Logo

郎哥编程

使用throw和throws 引发异常

2018-04-05 796

前面讨论了如何捕获Java运行时由系统引发的异常,如果想在程序中明确地引发异常,则需要用到throw和throws语句。

1、throw语句

throw语句通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。

throw语句的语法规则如下:

throw ThrowableInstance

其中,ThrowableInstance是Throwable类型或Throwable子类类型的一个对象。通过参数传递到catch子句,或者用new语句来创建一个实例。

下面通过示例演示throw的用法,代码如下:

package com.milihua.throwdemo;
public class ThrowDemo {
    static void demoproc() {
        try {
           throw new NullPointerException("demo");
        } catch(NullPointerException e) {
           System.out.println("Caught inside demoproc.");
           throw e; // rethrow the exception
        }
     }
 
     public static void main(String args[]) {
        try {
           demoproc();
        } catch(NullPointerException e) {
           System.out.println("Recaught: " + e);
        }
     }
 
}

在demoproc()方法的try语句块中,应用throw语句抛出一个NullPointerException异常,该异常被demoproc()方法的catch语句捕获,执行catch语句的代码,首先输出"Caught inside demoproc."语句到控制台,随后再次应用throw语句抛出NullPointerException异常,抛出的异常被main方法的catch语句捕获,输出异常信息。输出结果如下图所示:

                                 

a8000.png

           

图 13-7 TryDemo输出结果

 

语句“throw new NullPointerException("demo");”,用new来构造一个NullPointerException实例。所有的Java内置的运行时异常类有两个构造函数:一个没有参数,一个带有一个字符串参数。当用到第二种形式时,参数指定描述异常的字符串。如果对象用作 print( )或println( )的参数时,该字符串被显示。也可以通过调用gtMessage( )来实现,getMessage( )是由Throwable定义的。

2、throws语句

如果一个方法可以引发异常,而它本身并不对该异常进行处理,那么该方法必须将这个异常抛给调用者可以使程序能够继续执行下去,这时候就要用到throws语句。

throws语句的语法规则如下:

returnType  methodName()  throws  ExceptionType1, ExceptionType2,….
{
     ……..//方法体
}

在方法体中可以是引发异常列表中的任何一种异常及其子类型的异常。throws用来声明一个方法可能会抛出所有的异常,它跟在方法名称的后面。如果有多个异常,则使用逗号将其分开。调用者调用该方法时,必须在调用处处理这个异常,一般情况下由调用此方法的类来处理。

下面通过示例演示throws的用法,代码如下:

public class testThrows()
{ 
    public static void testdemo() throws NumberFormatException{  
        String s = "abc";  
        System.out.println(Double.parseDouble(s));  
    }  
 
    public static void main(String[] args) {  
        try {  
            function();  
        } catch (NumberFormatException e) {  
            System.err.println("非数据类型不能强制类型转换。");  
            //e.printStackTrace();  
    }  
}

如果方法声明后有throw语句,则在此方法被调用时,需要在调用方法中用try和catch进行异常捕获,如果不捕获异常,则需要在调用方法中使用throws语句将异常抛出。

当覆盖抛出异常的方法时,覆盖方法仅需要声明异常的同类或子类。例如,如果父类方法抛出IOException,则覆盖方法可以抛出IOException、FileNotFoundException(IOException的子类),但不可以抛出Exception(IOException的父类)。

3、throw和throws语句的组合应用

在实际应用中,一般都需要throw和throws语句组合应用,就是在捕获异常后,抛出一个明确的异常给调用者。例如,现在要使用一个相除的方法,但是在操作之前必须打印“运算开始”的信息,结束之后必须打印“异常结束”。

下面通过示例演示throw和throws组合应用的用法,代码如下:

package com.milihua.throwdemo;
public class ThrowAndThrowsDemo {
    public static int div(int i,int j) throws Exception{   
        // 定义除法操作,如果有异常,则交给被调用处处理
        System.out.println("***** 计算开始 *****") ;
        int temp = 0 ;    // 定义局部变量
        try{
         // 计算,但是此处有可能出现异常
            temp = i / j ;   
        }catch(Exception e){
            throw e;
        }finally{   
         // 不管是否有异常,都要执行统一出口
            System.out.println("***** 计算结束 *****") ;
        }
        return temp ;
    }
   
    public static void main(String args[]){
        try{
            System.out.println("除法操作:" + div(10,0)) ;
        }catch(Exception e){
            System.out.println("异常产生:" + e) ;
        }
    }
}

代码中div方法名称后面使用了throws语句抛出Exception异常,main方法是div方法的调用者,因此能够捕获throws语句抛出的异常。finally语句块是不管异常发生与否,都要执行的代码块,下一节会详细讲解。

■ 思考与练习

throw语句是编写在方法之中的,而throws语句是用在方法名称之后的。在同一个方法中使用throw和throws时要注意,throws抛出的类型范围要比throw抛出的对象范围大才可以。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论