异常处理(5) 手动抛出异常
Java 中异常对象的生成有两种方式:
- 由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,那么针对当前代码,就会在后台自动创建一个对应异常类的实例对象并抛出。
- 由开发人员手动创建:new 异常类型([实参列表]);如果创建好的异常对象不抛出,对程序没有任何影响,和创建一个普通对象一样。但是一旦throw抛出,就会对程序运行产生影响。
1、使用格式
throw new 异常类名(参数);
(throw的使用应写在方法体中)
throw语句抛出的异常对象,和JVM自动创建和抛出的异常对象一样。
- 如果是编译时异常类型的对象,同样需要使用throws或者try...catch处理,否则编译不通过。
- 如果是运行时异常类型的对象,编译器不提示。
- 可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:
- new String("want to throw");
典例:
(运行时异常)
public class ThrowTest {
public static void main(String[] args) {
Student s = new Student();
s.regist(10);
s.regist(-10);
}
}
class Student{
int id;
public void regist(int id){
if(id>0)
this.id = id;
else {
throw new RuntimeException("It's a RuntimeException.");//因为输出运行时异常,可以不作处理。
}
}
}
如果抛出非运行时异常,则必须完成异常的捕获。
(编译时异常)
public class ThrowTest {
public static void main(String[] args) {
Student s = new Student();
try {
s.regist(10);
s.regist(-10);
}catch (Exception e){
System.out.println("ends finishing an Exception.");
}
}
}
class Student{
int id;
public void regist(int id) throws Exception{
if(id>0)
this.id = id;
else {
//throw new RuntimeException("It's a RuntimeException.");
throw new Exception("It's a RuntimeException.");
}
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
'}';
}
}
2、使用注意事项
无论是编译时异常类型的对象,还是运行时异常类型的对象,如果没有被try..catch合理的处理,都会导致程序崩溃。
throw语句会导致程序执行流程被改变,throw语句是明确抛出一个异常对象,因此它下面的代码将不会执行。
如果当前方法没有try...catch处理这个异常对象,throw语句就会代替return语句提前终止当前方法的执行,并返回一个异常对象给调用者。
throw与throws的对比:
(1)throw用于手动抛出异常对象。
throws则用于对可能存在的异常进行声明处理,这个异常可能存在,抛给该方法的调用者;也可能不存在,顺利完成本方法的执行。
(2)throw语句中断当前程度的执行,其后代码不再运行,因此throw之后不应继续编写代码。
(3)throw只能抛出一个异常对象,throws可以声明多个可能存在的异常。
(4)throws可以单独使用,最后由调用者进行try-catch捕获异常。但throw必须与try-catch配套使用。