Java throw 和 throws
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虚拟机负责处理,一般不推荐这种处理方式,会浪费资源),上述代码分别给出了两种处理方法和处理结果。
注意:
- throw 抛出的是异常对象,而 throws 抛出的是异常类,当有多个异常类需要抛出时,则需要使用逗号隔开;
- throw 抛出异常可以在方法和代码块中,而 throws 只能用于方法参数列表后面,不能用于代码块中;
- 如果 throw 抛出的异常是运行时异常则可以不适用 throws 抛出异常;
- 当方法体使用 throw 关键字抛出检查时异常对象时,如果该异常对象已经通过 try-catch 进行处理,则可以不实用 throws ,否则必须使用 throws 抛出创建该对象的异常类或其父类;
- 当调用的方法抛出检查时异常,如果该异常已经通过 try-catch 处理,则不需要使用 throws 上抛异常,否则必须使用 throws 继续上抛异常;此时上抛的异常类可以是调用方法时方法抛出的异常类或其父类。
上一篇: throws与throw
下一篇: throw 和 throws