自定义异常类,以及详述throw与throws的区别

创建一个Person类

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

	public void setAge(int age) {
			this.age = age;
	}
}

如果我们想控制输入的age的范围在(1到150)可以有两种方法

  1. 在setAge方法内添加if语句直接作判断
public void setAge(int age) {
		if(age > 0 && age <= 150) {
			this.age = age;
		}
		System.out.println("输入的年龄应在1-150范围内");
	}

测试代码

public static void main(String[] args) {
		Person person = new Person();
		person.setAge(1000);
	}

结果

输入的年龄应在1-150范围内
  1. 在setAge方法中抛出异常,查看Java的API文档并没有关于超出年龄限制的异常类。
    所以这里就需要先自定义一个异常类

说明:这里自定义一个AgeException异常类有两种方法

  • 直接继承Exception,这时为检查时异常,但需要显式处理。
		public class AgeException extends Exception {
			public AgeException(String message) {
				super(message);
			}
		}

显示处理方法一:使用throws在方法上抛出,但是需要在调用该方法的代码中处理

	public void setAge(int age) throws AgeException {
		if(age> 0 && age <=150) {
			this.age = age;
		}
		throw new AgeException("年龄范围应为1-150");
	}

在测试方法中出现检查时异常
这里可以直接使用try…catch…处理(也可以继续在方法上使用throws抛出,让JVM处理)

public static void main(String[] args) {
		Person person = new Person();
		try {
			person.setAge(1000);
		} catch (AgeException e) {
			e.printStackTrace();
		}
	}

或者再次使用throws抛出该异常让JVM处理(不推荐)

public static void main(String[] args) throws AgeException {
		Person person = new Person();
			person.setAge(1000);
	}

显示处理方法二:使用try…catch…直接处理该异常

public void setAge(int age) {
		if(age> 0 && age <=150) {
			this.age = age;
		}
		try {
			throw new AgeException("年龄范围应为1-150");
		} catch (AgeException e) {
			e.printStackTrace();
		}
	}

  • 也可以继承RuntimeException(或者它的子类),这时为运行时异常,可以暂时不处理,也可以使用try…catch…显示或throws处理。
//		这里继承了RuntimeException
   		public class AgeException extends RuntimeException {
   			public AgeException(String message) {
   				super(message);
   			}
   		}
	public void setAge(int age) {
		if (age > 0 && age <= 150) {
			this.age = age;
		}
//		不会出现检查时异常,可以通过编译
//		也可以使用try......catch.....或throws处理(选择一种即可)
		throw new AgeException("年龄范围应为1-150");
	}

测试代码

	public static void main(String[] args) {
		Person person = new Person();
		person.setAge(1000);
	}

结果(两种方法抛出的异常相同):

xception in thread "main" com.xingtang.test3.AgeException: 年龄范围应为1-150
	at com.xingtang.test3.Person.setAge(Person.java:14)
	at com.xingtang.test2.Test.main(Test.java:8)

如果代码量较大使用异常自定义异常类,可以快速的查找出出现错误的代码位置,便于错位定位。

注意:try…catch…和thows使用一种即可
try…catch…:直接在该方法内把异常处理
throws:让方法的调用者处理(或者在本方法中使用try…catch…无法解决,让方法的调用者处理)

throw与throws的区别

1.throw 抛出的是异常对象,throws抛出的是类,如果需要抛出多个类需要用逗号隔开
2.throw 用于代码块和方法体中,throws只能用于方法的参数列表之后
3.如果throw抛出的是运行时异常和检查时异常的区别
如果throw抛出的是检查时异常需要显式的处理比如try…catch或throws,如果是运行时异常则不需要。
比如上面的自定义异常AgeException类,如果直接继承Exception的时候就是检查时异常,需要显式的处理才能通过编译,否则不能通过编译。而继承RuntimeException的时候可以不处理,也可以通过编译。

throw thows
抛出的是异常对象 throws抛出的是类
用于代码块和方法体中 只能用于方法的参数列表之后

猜你喜欢

转载自blog.csdn.net/qq_35302939/article/details/89739422