1.throw的用法
throw用于抛出异常对象;
①Test类
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setAge(100);
}
}
Student类
public void setAge(int age) {
if(age>1&&age<20) {
this.age = age;
System.out.println(age);
}else {
System.out.println("年龄无效");
}
}
代码如果是这样,如果age=100, 那就会输出“年龄无效”;这个提示不能让人看到,到底多少符合要求,所以就有了throw。
将代码改成
public void setAge(int age) {
if(age>1&&age<20) {
this.age = age;
System.out.println(age);
}else {
throw new AgeException("年龄无效");
}
}
创建一个自定义异常
如何自定义异常:创建继承Exception 或其子类的自定义类;自定义异常类调用父类构造函数(通常是含有一个String类型参数的构造函数);
代码如下:
package com.jd.exception;
public class AgeException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = -573493293922233554L;
public AgeException(String message) {
super(message);
}
}
这样就把异常抛给调用者,使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行(在这个异常之后的方法体中的内容不再执行)。在Test类中就显示:
如果使用try-catch捕获异常
package com.jd.vo;
public class Test {
public static void main(String[] args) {
Student student = new Student();
try{
student.setAge(100);
}catch(Exception e){
System.out.println("aaaaaa");
e.printStackTrace();
}
}
}
就会显示结果:
以上是运行时异常:①如果异常对象为运行时,则方法参数列表后面可以不使用throws,也可以将异常抛给方法调用者;调用者使用try-catch。
如果将AgeException继承的父类改了
package com.jd.exception;
public class AgeException extends Exception{
/**
*
*/
private static final long serialVersionUID = -1829894057306300522L;
public AgeException(String message) {
super(message);
}
}
就是检查时异常:
②如果异常对象为检查时,则方法参数列表后面必须使用throws抛出创建该对象的类;如果没有throws 必须try-cacth
则有俩种改法:
1)使用throws抛出创建该异常对象的类
throws用于声明方法可能抛出的异常,其后为异常类,可以有多个,异常类之间用英文逗号间隔。
public void setAge(int age) throws AgeException,NullPointerException{
if(age>1&&age<20) {
this.age = age;
System.out.println(age);
}else {
throw new AgeException("年龄无效");
}
}
这是抛出异常,则调用该方法的必须捕获异常
package com.jd.vo;
public class Test {
public static void main(String[] args) {
Student student = new Student();
try{
student.setAge(100);
}catch(Exception e){
System.out.println("aaaaaa");
e.printStackTrace();
}
}
}
2)异常使用try-cacth
public void setAge(int age){
if(age>1&&age<20) {
this.age = age;
System.out.println(age);
}else {
try{
throw new AgeException("年龄无效");
}catch(AgeException e){
System.out.println("aaaaaa");
e.printStackTrace();
}
}
}
调用该方法的,就可以不用再捕获异常了。
2.总结:
①如果异常对象为运行时,则方法参数列表后面可以不使用throws,也可以将异常抛给方法调用者;调用者使用try-catch。
②如果异常对象为检查时,则方法参数列表后面必须使用throws抛出创建该对象的类;如果没有throws 必须try-cacth
3.throw与throws的区别:
①抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
②使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;throws只能用在方法声明括号后面。(代码块中的异常,只能使用try-catch)