throw与throws
throw : 抛出的是异常类创建的对象,用于方法内或代码块内,throw 后面不能直接跟代码,不执行。
throws : 抛出的是异常类(检查时异常时才需要用到),用在方法列表参数括号的后面,如果不能throws(比如异常在非静态代码块内) 则需要 try-catch-finally
使用throws抛出后,谁调用这个方法就是抛给谁,此时调用该方法的要么try-catch-finally,要么抛给jdk
如果throws抛给别人,那么下面代码将不会执行
示例 : 我们先写一个封装类
package com.jd.test5;
import com.jd.exception.AgeException;
public class Student {
private int age;
public void setAge(int age) {
if (age < 0 || age > 15) {
System.out.println("年龄范围:大于0岁,小于15岁");
} else{
this.age = age;
}
}
public int getAge() {
return age;
}
}
package com.jd.test5;
public class Test5 {
public static void main(String[] args) {
Student student = new Student();
student.setAge(1200);
int age = student.getAge();
System.out.println(age);
}
}
但是此时,我们发现,单纯的输出提示无法定位到底程序哪个地方出现了问题 ,我们可以人为创建一个异常将其抛出
package com.jd.test5;
import com.jd.exception.AgeException;
public class Student {
private int age;
public void setAge(int age) {
if (age < 0 || age > 15) {
throw new NullPointerException("年龄范围:大于0岁,小于15岁");// 人为设计抛出一个异常,友好提示哪里出错;
}
} else {
this.age = age;
}
}
public int getAge() {
return age;
}
}
此时我们又发现在上例中使用的异常类和提示信息不符合,不能见名知意,那么此时我们可以自定义异常
自定义异常
自定义一个异常类,该类继承某个已有的异常类,如果throw抛出的是由运行时异常创建的对象则不需要显示使用throws;否则需要显示throws或者直接 try-catch-finally
package com.jd.exception;
public class AgeException extends RuntimeException{
public AgeException(String msg) {
super(msg);
}
}
那么我们就可以将封装类修改为:
package com.jd.test5;
import com.jd.exception.AgeException;
public class Student {
private int age;
public void setAge(int age) {
if (age < 0 || age > 15) {
throw new AgeException ("年龄范围:大于0岁,小于15岁");// 运行时异常,默认方法后面有throws
} else {
this.age = age;
}
}
public int getAge() {
return age;
}
}
如果将自定义类修改继承为检查时异常类
package com.jd.exception;
public class AgeException extends Exception{
public AgeException(String msg) {
super(msg);
}
}
那么此时封装类修改为
package com.jd.test5;
import com.jd.exception.AgeException;
public class Student {
private int age;
public void setAge(int age) /* throws AgeException */ {// 如果抛给别人,那么下面代码将不执行
if (age < 0 || age > 15) {
try {// 自己抛出又自己解决 // 抛给自己,下面代码依旧执行
throw new AgeException("年龄范围:大于0岁,小于15岁");
} catch (AgeException e) {
e.printStackTrace();// 在控制台打印异常信息在程序中出错的原因及位置
}
} else {
this.age = age;
}
System.out.println(age);// 如果上面使用throws抛给别人,该代码将不执行
}
public int getAge() {
return age;
}
}
代码分析:
package com.jd.test6;
public class Test6 {
public static void div(int a, int b) {
if (b == 0) {
try {
throw new Exception("分母不能为0");
} catch (Exception e) {
System.out.println("执行");
e.printStackTrace();
}
} else {
System.out.println(a / b);
}
}
public static void main(String[] args) {
try {
div(1, 0);
} catch (Exception e) {
System.out.println("永远无法执行");// 上面已经被解决掉了,不会再往外抛
}
}
}