异常处理之——throws|throw|自定义异常;关键的混淆点都在这里了

throws关键字

若某个方法可能会发生异常,但是不想在当前方法中来处理这个异常,那么可以将这个异常抛出,然后在调用该方法的代码中进行异常的捕获以及处理。
所以将异常抛出,可以用throws关键字来实现,throws关键字通常被应用在声明方法中,用来指定方法可能抛出的异常,多个异常可以用逗号来分隔。
如果异常的类型是Erro和RuntimeException或是它们的子类,那么可以不使用throws关键字来声明。
将异常通过throws关键字抛给上一级,如果仍然不限处理这个异常,可以继续向上抛出,但是最终必须有能够处理这个异常的代码。
格式:

返回值 方法名称()throws Exception{
    
    

}

异常是否抛出,站在哪个角度思考

如果是因为传参导致异常,应该通过throws将异常抛出去。
抛是抛给调用该方法的函数。



throw关键字

区分throws和throw。

与throws不同的是,throw用于方法体内,并且抛出一个异常类对象,而throws用在方法声明中。
throw抛出异常后,同样需要使用try…catch语句,上述两张情况,若throw抛出的异常Error、RuntimeException或它们的子类,则无须使用throws关键字或者try…catch。
格式:

throw new Exception("诶,就是抛着玩儿。");

为什么要自己抛出异常

有时候传入的参数并不会造成代码报错,但是在现实逻辑上不合理(例如年龄为-1),所以我们要创造一个异常抛出去告诉调用这里存在异常。

//构造age的setAge方法
public void setAge(int age){
    
    
    if(age<0 || age>200){
    
    
        RuntimeException e = new RuntimeException("年龄不合理");
        throw e;
        //throw new RuntimeException("年龄不合理"); 
    }else{
    
    
        this.age = age;
    }
}

使用异常处理语句的注意事项:

在使用try…catch,finally,throw,throws关键字时,要注意:

(1)不能单独使用try,catch或finall语句块。
(2)try语句块后面既可以只使用catch语句块,也可以只是用finally语句,当它们一起使用时,可以存在多个catch语句块,但是只能有一个finally语句,并且finally只能在catch之后。
(3)try只与finally语句块使用时,可以使程序在发生异常后抛出异常,并继续执行方法中的其他代码。
(4)try只与catch语句使用时,可以使用多个catch语句来捕获try语句块的异常,异常发生后,java虚拟机会由上而下来检测当前catch语句块所捕获的异常是否与try语句块中的发生的异常匹配。如果匹配,则不再执行其他catch语句。如果多个catch语句块捕捉的是同种类型的异常,则捕获子类异常的catch语句要放在父类异常的前面,否则编译出错。
(5)在try语句中声明的变量时局部变量,只在当前try语句中有效,在其后面的catch,finally语句中其他位置不能访问该变量,但在try,catch,finall语句块之外声明的变量,可以在ry,catch,finall语句块之内使用。
(6)对于发生的异常,必须使用try…catch语句来捕获。或者通过throws语句向上抛出,否则出错。
(7)在使用throw语句抛出一个异常对象时,该语句后面代码将不会被执行。
(8)finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return。所以一般不建议在finally语句块中写return语句。



自定义异常类(了解)

我们知道官方把1995年到目前常见的、共性的异常进行了归类,并制作了类。
如果有个异常官方没有(例如上面提到的年龄不合理异常),那么我们就可以自己写一个异常类归类这类异常。
或者是我们想在原有异常类上进行功能扩展,例如当某个异常出现时会自动给程序员发短信,那么也可以使用自定义异常类。
自定义异常类有两种类型:受检异常和非受检异常;

受检异常必须要try-catch和throws才能运行。
非受检异常则不需要。

猜你喜欢

转载自blog.csdn.net/m0_58702068/article/details/120505825
今日推荐