zoukankan      html  css  js  c++  java
  • Java中的Error和Exception

    Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

    Exception和Error体现了Java平台设计者对不同异常情况的分类。

    Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

    Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常 见的比如OutOfMemoryError之类,都是Error的子类。

    Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。

    不可查 的Error,是Throwable不是Exception。 不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕 获,并不会在编译期强制要求。

    Error和Exception的联系
    继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。

    Error和RuntimeException及其子类称为未检查异常(Unchecked exception),其它异常成为受检查异常(Checked Exception)。

    Error和Exception的区别
    Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

    Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

    异常处理的两个基本原则

    第一,尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常,在这里是Thread.sleep()抛出的InterruptedException。 这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作的艺术,所以我们有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛 的Exception之类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望RuntimeException被扩散出来,而不是被捕获。 进一步讲,除非深思熟虑了,否则不要捕获Throwable或者Error,这样很难保证我们能够正确程序处理OutOfMemoryError。

    第二,不要生吞(swallow)异常。这是异常处理中要特别注意的事情,因为很可能会导致非常难以诊断的诡异情况。 生吞异常,往往是基于假设这段代码可能不会发生,或者感觉忽略异常是无所谓的,但是千万不要在产品代码做这种假设! 如果我们不把异常抛出来,或者也没有输出到日志(Logger)之类,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异 常。

    OutOfMemoryError内存溢出一般是出现在申请了较多的内存空间没有释放的情形。

    //java.lang.OutOfMemoryError  -Xmx150m
    try {
        byte[] b = new byte[1024*1024*600];
    } catch (OutOfMemoryError e) {
        e.printStackTrace();
    }

    运行时,设置jvm最大的heap内存150m,此时申请600m的内存,因此会报error

    java.lang.OutOfMemoryError: Java heap space

    java.lang.StackOverflowError
    堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

    public static void main(String[] args) {
        method();
    }
     
    public static void method() {
        while (true) {
            method();
        }
    }

    无限次的递归调用出现

    Exception in thread "main" java.lang.StackOverflowError

    常见的异常;

    ArrayIndexOutOfBoundsException 数组下标越界异常,

    ArithmaticException 算数异常 如除数为零

    NullPointerException 空指针异常

    IllegalArgumentException 不合法参数异常

  • 相关阅读:
    仿佛看到了曾经在电子厂的自己
    TP5 condition 多个条件如何写
    电子数据时代我该如何保存我的数据?
    Shell脚本查询磁盘数量
    缺少维生素?
    html5的页面在IOS中,按钮 变成圆角怎么办?
    生物信息数据分析准则
    用variant的数据来推导基因表达 | Imputation of Expression Using PrediXcan
    Rare-Variant Association Analysis | 罕见变异的关联分析
    英语语法
  • 原文地址:https://www.cnblogs.com/alter888/p/11229782.html
Copyright © 2011-2022 走看看