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

Java throw 和 throws

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

throw

Java语言对异常的处理有两种形式,一种是 try-catch-finally 方法,另一种则是 throw 抛出异常方法,前一种我的另一篇博客中已有详述,在这里不再讨论;先看例子:

public class Person {
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age)  {
		if (age>=0 && age<=120) {
			this.age = age;
		}else {
			throw new NullPointerException("age取值范围为:0~120");	
		}
	}
}


public class Test{
	public static void main(String[] args) {
		Person person = new Person();
		person.setAge(200);
		System.out.println(person.getAge());
	}
}

Exception in thread "main" java.lang.NullPointerException: age取值范围为:0~120
	at p1.Person.setAge(Person.java:12)
	at p1.Test.main(Test.java:6)

我们先创建一个封装类 Person,定义 int age; 然后在 public 方法中对输入值进行限制,要求年龄必须在0~120之间(毕竟人年龄超级大的不多);超出这个限制的则抛出 NullPointerException 异常(这个异常也是执行时异常)并提示 “age取值范围为0~120”;

之后再创建一个Test类,并在其中创建 Person 类的一个对象 person ,并调用 person 的 setAge 方法进行赋值操作;赋的值为200(就是要它出现异常的);然后就会得到上面所示的结果;

throw 抛出异常相对于一般 System.out.println("age取值范围为:0~120"); 输出提示的优点在于: throw 抛出异常不仅会告诉你出现了异常,提示你正确的输入范围,还会告诉你异常的位置,有利于后期代码的维护和更改;而普通输出提示语句只会提示你输入范围,而不会告知你位置,如果只有几个小代码,我们可以直接遍查代码,但是如果是大工程的话,改错将会变得十分的麻烦,这就是 throw 抛出异常的优势所在。

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

throws

throws 是在 throw 抛出检查时异常时使用的,如果在 throw 抛出检查时异常时不使用 throws 抛出异常类,则程序不会通过编译(执行时异常可以直接通过编译,只有在程序执行时才会报错);

public class AgeException extends Exception{
	public AgeException(String message) {
		super(message);
	}
}

public class Person {
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age)  throws AgeException{
		if (age>=0 && age<=120) {
			this.age = age;
		}else {
			throw new AgeException("age取值范围为:0~120");	
		}
	}
}

public class Test{  //11
	public static void main(String[] args) throws AgeException {
		Person person = new Person();
		person.setAge(200);
		System.out.println(person.getAge());
	}
}

--------------------------------------------------------------------

public class Test{  //22
	public static void main(String[] args)  {
		Person person = new Person();
		try {
			person.setAge(200);
		} catch (AgeException e) {
			e.printStackTrace();
		}
		System.out.println(person.getAge());
	}
}

//11
Exception in thread "main" p1.AgeException: age取值范围为:0~120
	at p1.Person.setAge(Person.java:12)
	at p1.Test.main(Test.java:6)

---------------------------------------------------------------------
//22
0
p1.AgeException: age取值范围为:0~120
	at p1.Person.setAge(Person.java:12)
	at p1.Test.main(Test.java:7)

我们先自己定义一个异常 AgeException 类(自定义异常类这里不会详细说明,很简单,可自行百度);并继承 Exception 类(检查时异常),此时我们自定义的 AgeException 类就是一个检查时异常类,所以在这里我们不能直接进行 throw 抛出异常,必须对其进行 try-catch 或 throws 抛出异常处理,因为在这里我们主要讨论的是 throws 抛出异常,所以这里我们用 throws 抛出异常处理;

之后同样是在 Test 类中创建 Person 类的 person 对象并进行 setAge 赋值操作,因为在 Person 类中进行了 throws 抛出异常处理(相当于将异常处理的任务转交给使用该方法导致异常的类(这里是Test类)进行处理);所以在这里(在Test类中)我们也需要对抛出的异常进行处理,依旧是两种选择: try-catch 处理和 throws 继续上抛异常处理(上抛之后则由JVM虚拟机负责处理,一般不推荐这种处理方式,会浪费资源),上述代码分别给出了两种处理方法和处理结果。

注意:

  1. throw 抛出的是异常对象,而 throws 抛出的是异常类,当有多个异常类需要抛出时,则需要使用逗号隔开;
  2. throw 抛出异常可以在方法和代码块中,而 throws 只能用于方法参数列表后面,不能用于代码块中;
  3. 如果 throw 抛出的异常是运行时异常则可以不适用 throws 抛出异常;
  4. 当方法体使用 throw 关键字抛出检查时异常对象时,如果该异常对象已经通过 try-catch 进行处理,则可以不实用 throws ,否则必须使用 throws 抛出创建该对象的异常类或其父类;
  5. 当调用的方法抛出检查时异常,如果该异常已经通过 try-catch 处理,则不需要使用 throws 上抛异常,否则必须使用 throws 继续上抛异常;此时上抛的异常类可以是调用方法时方法抛出的异常类或其父类。

上一篇: throws与throw

下一篇: throw 和 throws