使用throw和throws引发异常 throw与throws的区别

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

1. throw语句

throw语句用来明确地抛出一个“异常”。这里请注意,用户必须得到一个Throwable类或其他子类产生的实例句柄,通过参数传到catch子句,或者用new语句来创建一个实例。throw语句的通常形式如下。

throw ThrowableInstance

【示例2】ThrowDemo.java

创建ThrowDemo.java演示throw的相关用法。

ThrowDemo.java的代码清单如下所示。

public class ThrowDemo {

/**

* @param args

*/

public static void main(String[] args) {

int number=0;

try{

number=Integer.parseInt(args[0]);

}catch(Exception e){

throw new ArrayIndexOutOfBoundsException("数组越界");

//System.out.println("非法的数字");

}

System.out.println("你输入的数字为:"+number);

}

}

若不提供参数,会引发数组越界的异常(ArrayIndexOutOfBoundsException即为数组越界异常类,如果想了解异常的详细情况,请参见10.5小节内容)。运行ThrowDemo类,控制台的输出结果如图10.10所示。

执行throw语句后,运行流程将立即停止,throw的下一条语句也将暂停执行。throw后必须抛出一个Throwable类的实例。



图10.10 当参数为空时的输出结果

从图10.10可以看出,throw语句一经执行,后面的语句都不会被执行。

2. throws语句

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

returnType methodName() throws ExceptionType1,ExceptionType2,…{

… //method body

}

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

【示例3】ThrowsDemo.java

创建ThrowsDemo.java演示throws的相关用法。

public class ThrowsDemo {

/**

* @param args

使用throw和throws引发异常 throw与throws的区别
*/

public static void main(String[] args) {

testThrows(args);

}

public static void testThrows(String[] tmp) {

try {

createThrow(tmp);

} catch (Exception e) {

System.out.println("来自createThrow方法的异常");

}

}

// 抛出可能存在的异常

public static void createThrow(String[] tmp) throws Exception {

int number = 0;

number = Integer.parseInt(tmp[0]);

System.out.println("你输入的数字为:" + number);

}

}

如果方法签名后有throws关键词,则在此方法被调用时,需要在调用方法中用try和catch进行捕获异常,如果不捕获异常,则需要在调用方法中使用throws关键词将异常抛出。代码中的testThrows()方法也可以改为如下所示。

public static void testThrows(String[] tmp) throws Exception {

createThrow(tmp);

}

被调用的方法和调用方法处理异常的关系示意图如图10.11所示。



图10.11 被调用的方法和调用方法处理异常的关系示意图

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

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

在实际的应用中,一般都需要throw和throws语句组合应用,就是在捕获异常后,抛出一个明确的异常给调用者。

【示例4】ThrowAndThrowsDerno.java

创建ThrowAndThrowsDerno.java演示throw和throws语句的组合应用。

public class ThrowAndThrowsDemo {

/**

* @param args

*/

public static void main(String[] args) {

testThrow(args);

}

// 调用有异常的方法

public static void testThrow(String[] tmp) {

try {

createThrow(tmp);

} catch (Exception e) {

System.out.println("捕捉来自createThrow方法的异常");

}

}

// 抛出一个具体的异常

public static void createThrow(String[] tmp) throws Exception{

int number = 0;

try {

number = Integer.parseInt(tmp[0]);

} catch (Exception e) {

throw new ArrayIndexOutOfBoundsException("数组越界");

// System.out.println("非法的数字");

}

System.out.println("你输入的数字为:" + number);

}

}

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

  

爱华网本文地址 » http://www.413yy.cn/a/25101014/197603.html

更多阅读

电脑待机与休眠的区别 电脑待机和休眠的区别

电脑待机与休眠的区别? ? 首先确定的是休眠和待机不能下载的。因为硬盘都断电了。?休眠和待机的原理都是吧内存的东西保存住,下次就可以不用重新加载操作系统,但他们最大的不同是前者把内存中的数据临时保存到硬盘中,下次开机就直接

港货与行货的区别 港版和国行怎么分辨

港货与行货的区别——简介港货和行货通常代表从不同销售渠道进入大陆的电子产品,下面简单和大家分享港货和行货的区别。港货与行货的区别——工具/原料聪明的你港货与行货的区别——方法/步骤港货与行货的区别 1、

函数COUNT与COUNTA的区别 excel count和counta

函数COUNT与COUNTA的区别——简介COUNT与COUNTA经常用在Excel统计参数列表中指定项个数的情景中。而两者也是存在这差别的,如果不注意的话,这两个函数就容易搞混;这两个函数应该说很简单,也比较容易掌握,但大多数人可能只知COUNT不知COUN

声明:《使用throw和throws引发异常 throw与throws的区别》为网友讨喜冤家分享!如侵犯到您的合法权益请联系我们删除