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虚拟机负责处理,一般不推荐这种处理方式,会浪费资源),上述代码分别给出了两种处理方法和处理结果。

注意:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值