谈谈Java异常

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/huangshanchun/article/details/79027203

0 概述

对于java工程师来说,是经常和异常打交道的,本文主要来谈一谈java中的异常。

1 异常类的继承关系

从下图(说明:图中只是列出部分异常类)可以看出:

  • 异常的基类为Throwable,主要分为两个分支,即Error体系和Exception体系。
  • Exception下面分为RuntimeException和非RuntimeException(如IOException)

异常类图

2 几种异常的区别

Java里面异常分为两大类:checked exception(检查异常)和unchecked exception(非检查异常),对于非检查异常也叫RuntimeException(运行时异常),对于运行时异常,java编译器不要求捕获或者抛出,但是对检查异常要求你必须捕获或者继续抛出,不然编译会报错。

  • Error表明应用程序除了比较严重的问题,不应该捕获这种异常,显然这种异常也属于非受检异常,比如StackOverflowError。当然这种异常也是可以捕获的,只是捕获后没有太大意义,因为大多数情况下都无法处理。
  • RuntimeException 属于非受检异常, 比如如典型的NullPointerException。
  • Exception下的非RuntimeException异常,属于检查异常,比如IOException,在使用IO操作类时候,编译器会提示捕获或者抛出这类异常。
import java.io.IOException;

/**
 * Created by apple on 18/1/10.
 */
public class ExceptionTest {
    public static void main(String[] args) {
       // testRuntimeException();
        //Error:(12, 32) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
        //testNotRuntimeException();
       // testError();
        tryCatch();
    }

   //不要求捕获或者抛出
    public static void testRuntimeException() {
        throw new RuntimeException("testRuntimeException");
    }

    public static void testNotRuntimeException() throws IOException {
        throw new IOException("testNotRuntimeException");
    }

    public static void testError() {
        throw new StackOverflowError("error");
    }

    //可以捕获所以的异常
    public static void tryCatch() {
        try {
            testError();
            testNotRuntimeException();
            testRuntimeException();

        } catch (Throwable throwable) {
            System.out.println("I catch throwable" + throwable);
        }
    }


}

3 总结

对于异常很多人喜欢直接try catch 所有的异常,这显然是不对的。我们应该捕获能处理的异常,抛出不能处理的异常。

猜你喜欢

转载自blog.csdn.net/huangshanchun/article/details/79027203