谈谈Java异常

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 所有的异常,这显然是不对的。我们应该捕获能处理的异常,抛出不能处理的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值