1

你能保证你的代码没有异常吗?

 2 years ago
source link: https://blog.csdn.net/qq_41973594/article/details/120856612
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

(一)Java中的异常

Java中的异常都来自于java.lang.Throwable类,从异常类型上分,Java中的异常可以分为Exception和Error。Exception异常可以被程序本身处理,Error无法被程序处理。

Exception异常又可以分为受检查异常和不受检查异常,所谓受检查异常是指那些在编程期间就需要把异常try/catch或throws出来的异常,不受检查异常是指在编程期间不需要通过代码来显式地catch出来。我画了个图展示异常的类型:

(二)如何处理异常

Error类型的异常属于尽量去避免而非在代码里去处理的异常,因此我们在处理异常章节主要介绍Exception类型的异常。

不受检查异常往往是程序员的代码逻辑疏忽导致,比如空指针异常,只需要在调用对象之前判断是否是空对象就可避免;下标越界异常只需要保证永远在下标范围内访问即可避免。

受检查异常必须在代码中通过try/catch或者throws才能通过编译,比如下面这段读取文件的代码:

public class ExceptionTest{
    public void readFile() throws FileNotFoundException {
        FileInputStream fileInputStream=new FileInputStream("xxx.text");
    }
}

当使用new FileInputStream(“xxx.text”)获取文件时,FileNotFoundException属于受检查异常,就必须抛出或者被捕获。除了throws之外,还可以使用try/catch

public class ExceptionTest{
    public void readFile() {
        try {
            FileInputStream fileInputStream=new FileInputStream("xxx.text");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
        }
    }
}

(三)try/catch与throws的区别

受检查异常的捕获有两种方式:try/catch和throws。区别在于,try/catch捕获到异常后直接在catch语句块里进行处理,处理完成之后程序继续往下执行。而throws则是将异常抛给它的上一级进行处理,程序就不会再往下执行了。

使用catch捕获到异常之后,我们可以对异常进行处理,常见的方式就是将异常打印出来或者写入到日志里。下面是Throwable类中的常用方法。

public String getMessage() //返回异常的简要信息
public String getLocalizedMessage() //返回异常的本地化信息,默认和getMessage是一样的,如果要加入本地化信息往往是子类重写这个方法
public String toString() //返回异常的更详细信息
public void printStackTrace() //在控制台输出异常信息。

try/catch之后往往还会更finally语句块,finally语句块中的代码会在程序处理完成最后被执行,不管是否进入异常。如果在代码块中有return语句,在return执行之前,finally语句块中的代码会被先执行。 finally 语句的返回值将会覆盖原始的返回值。

(四)自定义异常

除了使用Java自带的异常之外,我们还可以自己定义一些异常,自定义异常比较简单,继承Exception或者RuntimeException,通过构造方法将异常信息通过super返回。

public class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String message){
        super(message);
    }
    public MyException(String message,Throwable cause){
        super(message,cause);
    }
    public MyException(Throwable cause){
        super(cause);
    }
}

(五)总结

代码功力再强大,也有碰到异常的时候,合理作好异常处理可以让你代码更稳定,也更容易排查问题。我是鱼仔,我们下期再见。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK