一、throw关键字:
1.throw用于抛出一个具体异常类的对象,一般用于方法体中。它的使用条件为:当所写的代码因不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员。
代码示例:
public class Test {
public static int div(int a, int b) {
if(b==0) {
throw new RuntimeException("操作失败,分母不能为零。");//当分母为零时逻辑错误,因此此处用throw抛出一个异常对象
}else {
return a/b;
}
}
public static void main(String[] args) {
System.out.println(Test.div(2, 0));//分母为零,程序运行时控制台显示异常信息
}
}
2.throw关键字一般用在方法体中,也可以用在代码块中,但如果代码块中抛出的异常对象是由检查时异常创建的,则必须使用try-catch进行处理;
代码示例:
public class Test {
int a = 7;
int b = 0;
{
if(b==0) {
try {
throw new Exception("操作失败,分母不能为零。");//此处抛出的对象为检查时异常,因此必须使用try-catch,否则会报错。
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(a/b);
}
public static void main(String[] args) {
new Test();
}
}
3.throw可以将异常对象抛给自己或者抛给方法调用者。
①抛给自己:
public class Test {
int a = 7;
int b = 0;
{
if(b==0) {
try {//异常抛出的同时使用try-catc处理
throw new RuntimeException("操作失败,分母不能为零。");
} catch (Exception e) {
System.out.println("分母不能为零。");
e.printStackTrace();
}
}
System.out.println(a/b);
}
public static void main(String[] args) {
new Test();
}
}
②抛给方法调用者:
public class Test {
int a = 7;
int b = 0;
{
if(b==0) {
throw new RuntimeException("操作失败,分母不能为零。");
}
System.out.println(a/b);
}
public static void main(String[] args) {
try {//在调用或者实例化时进行try-catch
new Test();
} catch (Exception e) {
System.out.println("分母不能为零。");
e.printStackTrace();
}
}
}
4.使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行。
代码示例:
public class Test {
int a = 7;
int b = 0;
{
if(b==0) {
throw new RuntimeException("操作失败,分母不能为零。");
}
System.out.println(a/b);
}
public static void main(String[] args) {
new Test();//此处没有对异常进行捕获,因此之后的代码不会执行。
System.out.println("改行代码及其之后的代码均不会执行。");
}
}
二、throws关键字:
1.throws用于声明方法可能抛出的异常,它抛出的是异常类,可以有多个,异常类之间用英文逗号间隔。他的使用条件为:①当方法体中的throw关键字抛出由检查时异常创建的对象时,如果该异常对象在抛出的同时已经通过try-catch进行了处理,则可以不使用throws,否则必须使用throws抛出创建该对象的异常类或其父类。②所调用的方法抛出了检查时异常时,如果该方法在调用的同时已经通过try-catch进行了处理,则可以不使用throws继续上抛该异常,否则必须使用throws才能上抛该异常,此时上抛的异常类可以是调用方法时方法抛出的异常类也可以是其父类。
2.如果方法中的异常已经通过try-catch进行了捕获则无需再使用throws上抛该异常了,否则即使上抛也无效,只会做无用功。
3.如果方法中的代码或者方法中所调用的代码没有使用throw抛出异常类对象,则无需使用throws否则该throws所抛出的异常类无效:即使用throws则其方法中的代码一定存在使用throw抛出异常对象的代码。
三、throw与throws的区别:
1.抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
2.使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;throws只能用在方法声明括号后面。