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

Posted Java鱼仔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你能保证你的代码没有异常吗?相关的知识,希望对你有一定的参考价值。

(一)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);
    }
}

(五)总结

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

以上是关于你能保证你的代码没有异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

修改代码参考手册

你能在每个块中捕获不止一种类型的异常吗? [复制]

这个代码片段有啥作用?

在 JSP 中的 <% %> 代码片段中添加链接

线程池执行器异常

日期错误异常