美文网首页MacOS, Java和IDEA
Java语言中的异常

Java语言中的异常

作者: SpaceCat | 来源:发表于2020-05-06 23:30 被阅读0次

1、异常分类

从产生源头来看,Java语言中的异常可以分为两类:

  • JVM抛出的异常。比如:访问null引用会引发NullPointerException;0作为除数,如9/0,JVM会抛出ArithmeticException;内存消耗完,申请分配失败,JVM会抛出OutOfMemoryError。
    注意:这些JVM的异常也可以在java代码中显式抛出(尽管我们很少这么做,基本也没有必要),如下例子中的代码可以正常编译。
    public class Test {
        public static void main(String []args){
            String s = null;
            if (s == null) {
                throw new NullPointerException("Exception: s should not be null");
            }
            throw new OutOfMemoryError();
        }
    }
    
  • 除了JVM的异常,其他异常都是程序引起的,是程序中显式通过throw语句抛出的。
    比如,在Long.parseLong(String s, int radix)的源码中包含如下代码:
    if (s == null) {
        throw new NumberFormatException("null");
    }
    
    也就是说,方法会抛出NumberFormatException异常。

一般情况下,jvm异常是由jvm抛出的,不会被开发者显式抛出。当然,也可以在程序中通过throw语句显式抛出jvm异常。如下:

if (s == null) {
    throw new NullPointerException(“s can not be null”);
}

所有的jvm异常都是unchecked,而程序中的异常则unchecked和checked都有。

2、异常类的继承层次

Java语言中的类继承层次如下图:


Java异常层次

Throwable有两个子类Exception和Error。其中:

  • Exception是和应用相关的,NullPointerException出现在当试图访问空对象的时候,ClassCastException出现在试图转换不兼容的类型时。可以通过try catch语句捕获Exception之后处理,可以让程序恢复运行。
  • Error是和应用运行的环境相关的,比如OutOfMemoryError出现在jvm内存耗尽的时候、StackOverflowError出现在栈溢出的时候。正因为如此,程序基本不可能在Error发生时恢复,所以,Error不能被try catch语句处理。

从这个图中可以看出,类也分为Checked异常和Unchecked异常。
Checked异常是java编译器强制处理的异常,必须通过try catch语句捕获,或者通过throws语句抛出。如果显式不处理,就会编译报错。比如网络连接失败的时候,会抛出IOException,程序应该提前预料并对这个异常做出恰当的处理,比如在网络中断时重新传输文件,这样程序才不会因为异常终止运行,崩溃挂掉。
Unchecked异常通常是开发者代码逻辑错误造成的:如NullPointerException(通常在程序设计时通过检查引用是否为空避免);如一些是java.lang.Error的子类,在任何一个实例对象创建的时候都有可能发生OutOfMemoryError(但是,我们不可能在每一个创建对象实例的地方都用try catch捕获这个异常,因为这个异常是unchecked,在实际编程中也无需这么做)。通常来说,unchecked异常是无法预料,编译器无法检测的异常。

3、checked和unchecked异常

自定义的异常是checked,还是unchecked取决于继承的父类是checked异常,还是unchecked异常。
try catch块中catch的checked异常,必须在try块中有出现这种异常的可能性,不然编译不通过。但是,Throwable和Exception这两个类有些特殊,尽管他们是checked异常,不过,即使在try块中没有出现该异常的可能性,依然可以捕获它们。因为他们都有unchecked异常子类(如RuntimeException),编译器不检查unchecked异常,也就允许这样捕获unchecked异常。

参考资料

相关文章

  • Chapter 5 . 异常

    阅读原文 Chapter 5 . 异常 5.1 Java异常 异常:在Java语言中,将程序执行中发生的不正常情...

  • Java语言中的异常

    1、异常分类 从产生源头来看,Java语言中的异常可以分为两类: JVM抛出的异常。比如:访问null引用会引发N...

  • Java语言基础五 (异常机制)

    异常机制 - 异常即指程序执行中发生的不正常情况。 java.lang.Throwable类是Java语言中错误(...

  • JAVA中的Excption与Error

    java的异常架构图 1. Throwable Throwable是 Java 语言中所有错误或异常的超类。Thr...

  • Java & Groovy & Scala & Kotlin -

    Overview 本章主要介绍各语言中异常声明和处理方式。 Java 篇 分类 在 Java 中异常是种特殊对象,...

  • 用Java实现JVM第十章《异常处理》

    案例介绍异常处理是java语言非常重要的一个语法,本章主要实现如何处理抛出的异常。 在Java语言中,异常可以分为...

  • 用Java实现JVM第十章《异常处理》

    案例介绍 异常处理是java语言非常重要的一个语法,本章主要实现如何处理抛出的异常。 在Java语言中,异常可以分...

  • 异常

    异常Throwable 概念: Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(...

  • 面向对象-异常

    异常概述 什么是异常(Exception:Java在运行过程当中出现的错误 Throwable 类是 Java 语...

  • 2018-07-13

    异常 处理程序中的错误一套机制Throable是java语言中所有错误和异常的超类printStackTrace(...

网友评论

    本文标题:Java语言中的异常

    本文链接:https://www.haomeiwen.com/subject/esjnghtx.html