Java之路:throws、throw

throws

在Java标准库中的方法通常并没有处理异常,而是交由使用者来处理,如判断整数数据格式是否合法的Integer.parseInt()方法就会抛出NumberFormatException异常。

这是怎么做到的?看一下API文档中的方法原型:

public static int parseInt(String s)
throws NumberFormatException

就是这个“throws”关键字,如果字符串s中没有包含可解析的整数就会“抛出”异常。

使用throws声明的方法表示此方法不处理异常,而由系统自动将所捕获的异常信息“抛给”上级调用方法。

throws使用格式如下:

访问权限 返回值类型 方法名称(参数列表) throws 异常类
{
    // 方法体;
}

上面的格式包括两个部分:一个普通方法的定义,这和以前学习到的方法定义模式没有任何区别;方法后紧跟“throws 异常类”,它位于方法体{}之前,用来检测当前方法是否有异常,若有,则将该异常提交给直接使用这个方法的方法。

package com.xy.exception;

public class Throws {
	public static void main(String[] args) {
		int[] arr = new int[5];
		try {
			setZero(arr, 10);
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("数组超出绑定范围!");
			System.out.println("异常:" + e);
		}
		System.out.println("end of main() method!");
	}
	
	private static void setZero(int[] arr, int index) throws ArrayIndexOutOfBoundsException {
		arr[index] = 0;
	}
}

【结果】
在这里插入图片描述
在上例中,定义了私有化的静态方法setZero(),用于将指定的数组的指定索引赋值为0,由于没有检查下标是否越界(当然,并不建议这样做,这里只是显示一个抛出方法异常的例子),所以使用throws关键字抛出异常,“ArrayIndexOutOfBoundsException”表明setZero()方法可能存在的异常类型。一旦方法出现异常,setZero()方法自己并不处理,而是将异常提交给它的上级调用者main()方法。而在main方法中,有一套完善的try-catch机制来处理异常。

throw

到现在为止的所有异常类对象全部都是由JVM自动实例化的,但有时用户希望能亲自进行异常类对象的实例化操作,自己手工抛出异常,那么此时就需依靠throw关键字来完成了。

与throws不同的是,可直接使用throw抛出一个异常,抛出时直接抛出异常类的实例化对象即可。

throw语句的格式为:

throw 异常类型的实例;

执行这条语句时,将会“引发”一个指定类型的异常,也就是抛出异常。

public class Throw {
	public static void main(String[] args) {
		try {
			throw new ArrayIndexOutOfBoundsException("\n我是个性化的异常信息:\n数组下标越界");
		} 
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("数组超出绑定范围!");
			System.out.println("异常:" + e);
		}
	}
}

【结果】
在这里插入图片描述

throw关键字的使用完全符合异常的处理机制,但是,一般来讲用户都在避免异常的产生,所以不会手工抛出一个新的异常类型的实例,而往往会抛出程序中已经产生的异常类实例。

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84940889
今日推荐