欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

总结throw与throws

程序员文章站 2022-07-14 10:40:55
...

1,有关throw:throw用于抛出具体异常类的对象,一般用于方法体中,也可用于代码块中,但如果代码块中抛出的异常对象是由检查时异常创建的,则必须使用try-catch进行处理。

//throw什么时候用?
//学生类
public class Student {

	private int age;
	public int getAge() {
		return age;
	}

	public void setAge(int age) throws AgeException {
		if (1<age&&age<150) {
			this.age = age;
		}else {
			throw new NullPointerException("age值不能大于150");	//抛出异常:直接抛出异常出处,便于查找异常来自于哪里。
		}		//throw的用处:当所写的代码因不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员
	}			//由于此处异常并非NullPointerException异常,我们可以自定义异常AgeException类
}

//测试类
public class Test {

	public static void main(String[] args) {
		Student student=new Student();
		student.setAge(1000);		//存值时出错。不满足setAge方法中的if条件
		System.out.println(student.getAge());
	
	}
}

什么时候使用

当所写的代码因不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员。

特别地,如果代码块中抛出的异常对象是由检查时异常创建的,则必须使用try-catch进行处理。

public class Test {

	int a = 9;
	int b = 0;
	{
		if (b == 0) {
			try {
				throw new Exception("操作失败:分母不能为0");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println(a / b);
	}

	public static void main(String[] args) {
		new Test();
	}
}

2,throw与throws以及throws什么时候用(延用上边的学生类和测试类,新增一个自定义异常类)

//首先自定义一个异常类,因为必须继承自异常父类,所以分两种情况,继承自运行时异常或继承自检查时异常

1)继承自运行时异常:

public class AgeException extends RuntimeException{
	public AgeException(String message) {
		super(message);
	}
}
//此时异常可以用throw抛出就可以解决问题
public void setAge(int age) {
	if (1<age&&age<150) {
		this.age = age;
	}else {
		throw new AgeException("age值不能大于150");
	}
}

2)继承自检查时异常:

public class AgeException extends Exception{
	public AgeException(String message) {
		super(message);
	}
}
//有两种方法处理

01)在throw抛出异常的同时使用try-catch进行处理

try {
	throw new AgeException("age值不能大于150");
	} catch (AgeException e) {
			e.printStackTrace();
}

02)在throw抛出异常后用throws继续抛出检查时异常对象,在Test中用try-catch解决,或者继续上抛由JVM解决。

//学生类中
public void setAge(int age) throws AgeException {
	
	if (1<age&&age<150) {
		this.age = age;
	}else {
		throw new AgeException("age值不能大于150");
		//当抛出异常后,抛向了调用他的Test类,可以在Test中捕获异常,也可以在Test类中继续抛出给JVM处理。
	}
}

i)Test类中解决异常的代码

public static void main(String[] args) {
	
	Student student=new Student();
	try {		//用try-catch处理掉
		student.setAge(1000);
	} catch (AgeException e) {
		e.printStackTrace();
	}
	System.out.println(student.getAge());
}

ii)Test类中继续抛出异常的代码

public static void main(String[] args) throws AgeException {
	Student student=new Student();
	student.setAge(1000);
	System.out.println(student.getAge());
}

什么时候用:

当方法体中的throw关键字抛出由检查时异常创建的对象时,如果该异常对象在抛出的同时已经通过try-catch进行了处理,则可以不使用throws,否则必须使用throws抛出创建该对象的异常类或其父类。
所调用的方法抛出了检查时异常时,如果该方法在调用的同时已经通过try-catch进行了处理,则可以不使用throws继续上抛该异常,否则必须使用throws才能上抛该异常,此时上抛的异常类可以是调用方法时方法抛出的异常类也可以是其父类。

以下为补充:
1,使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行。

public class Test {
	public static void main(String[] args) {
		div(1, 0);
		System.out.println("代码2");	//因为调用div方法时,调用的方法抛出了异常对象,而调用方法的代码没有try-catch进行捕获处理,所以此行代码不执行

	}

	static void div(int a, int b){
		if(b==0){
			throw new UnsupportedOperationException("第二个参数不能为0");
		}
		System.out.println("代码1");	//由于调用方法时b为0,if条件语句执行,又因为没有对抛出的异常使用try-catch捕获,所以此行代码不执行
	}
}

2,throws

throws用于声明方法可能抛出的异常,其后为异常类,可以有多个,异常类之间用英文逗号间隔。
如果方法中的异常已经通过try-catch进行了捕获则无需再使用throws上抛该异常了,否则即使上抛也无效,只会做无用功。
如果方法中的代码或者方法中所调用的代码没有使用throw抛出异常类对象,则无需使用throws否则该throws所抛出的异常类无效:即使用throws则其方法中的代码一定存在使用throw抛出异常对象的代码。

3,throw与throws的区别:

抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;throws只能用在方法声明括号后面;