Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别

摘要:
异常和错误反映了Java平台设计者对不同异常的分类。异常和错误反映了Java的两种异常处理方法。]异常分为检查异常和非检查异常。错误:1.它总是无法控制的。2: 错误和异常的使用场景:eg01:经典面试问题:NoClassDefFoundError和ClassNotFoundException之间有什么区别?首先,NoClassDefFoundError是一个错误,ClassNotFoundException是一个异常。ClassNotFoundException表示如果在编译期间可能发生此异常,则必须在编译期间引发ClassNotFoundException异常!

一:Error和Exception的基本概念:

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

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类,Exception和Error体现了JAVA这门语言对于异常处理的两种方式。

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

Error是java程序运行中不可预料的异常情况(正常情况下不大可能出现的情况),这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。【表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误 ,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。 Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。】

其中的Exception又分为检查性异常(checked)和非检查性异常(unchecked)。两个根本的区别在于,检查性异常 必须在编写代码时,使用try catch捕获(比如:IOException异常)。非检查性异常 在代码编写使,可以忽略捕获操作(比如:ArrayIndexOutOfBoundsException),这种异常是在代码编写或者使用过程中通过规范可以避免发生的,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。

切记,Error是Throw不是Exception 。

二者的不同之处(小总结):

Exception
1.可以是可被控制(checked) 或不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
Error:
1.总是不可控制的(unchecked)。
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。

如下是常见的 Error 和 Exception:

1)运行时异常(RuntimeException)也称 【非检查型异常 UncheckedException】

  • Nullpointer Exception:空指针异常;
  • ClassCastException:类型强制转换异常
  • IllegalArgumentException:传递非法参数异常
  • IndexOutOfBoundsException:下标越界异常
  • NumberFormatException:数字格式异常
  • ArrayIndexOutOfBoundsException: 数组越界异常
  • ArrayStoreException: 数据存储异常,操作数组时类型不一致
  • ArithmeticException: (算术异常)
  • BufferOverflowException: (缓冲区溢出异常)


2)非运行时异常(CheckedException)也称 【检查型异常】:

  • ClassNotFoundException:找不到指定 class 的异常
  • IOException:IO 操作异常
  • FileNotFoundException:文件不存在异常
  • SQLException:SQL语句异常
  • InterruptedException: (中断异常-调用线程睡眠时候)


3)错误(Error):

  • NoClassDefFoundError:找不到 class 定义异常
  • StackOverflowError:深递归导致栈被耗尽而抛出的异常
  • OutOfMemoryError:内存溢出异常

eg(代码示例01)

下面代码会导致 Java 堆栈溢出错误。

/ 通过无限递归演示堆栈溢出错误
class StackOverflow {
    public static void test(int i) {
        if (i == 0) {
            return;
        } else {
            test(i++);
        }
    }
}
public class ErrorEg {
    public static void main(String[] args) {
        // 执行StackOverflow方法
        StackOverflow.test(5);
    }
}

运行输出为:

Exception in thread "main" java.lang.StackOverflowError
    at ch11.StackOverflow.test(ErrorEg.java:9)
    at ch11.StackOverflow.test(ErrorEg.java:9)
    at ch11.StackOverflow.test(ErrorEg.java:9)
    at ch11.StackOverflow.test(ErrorEg.java:9)

上面代码通过无限递归调用最终引发了 java.lang.StackOverflowError 错误。

二:Error和Exception的使用场景:

eg01:经典的面试题目: 就是 NoClassDefFoundError 和 ClassNotFoundException 有什么区别

区别一: NoClassDefFoundError它是Error,
ClassNotFoundException是Exception。 区别二:NoClassDefFoundError是JVM运行时通过classpath加载类时,找不到对应的类而抛出的错误。
ClassNotFoundException是在编译过程中如果可能出现此异常,在编译过程中必须将ClassNotFoundException异常抛出! NoClassDefFoundError发生场景如下
1、类依赖的class或者jar不存在 (简单说就是maven生成运行包后被篡改) 2、类文件存在,但是存在不同的域中 (简单说就是引入的类不在对应的包下) 3、大小写问题,javac编译的时候是无视大小的,很有可能你编译出来的class文件就与想要的不一样!这个没有做验证 ClassNotFoundException发生场景如下: 1、调用class的forName方法时,找不到指定的类 2、ClassLoader 中的 findSystemClass() 方法时,找不到指定的类 举例说明如下: Class.forName("abc"); 比如abc这个类不存项目中,代码编写时,就会提示此异常是检查性异常,比如将此异常抛出。

三:运行时异常(Runtime exception)与检查型异常(checked exception)的区别:

 Java提供了两类主要的异常:runtime exception和checked exception。

1:checked (检查型异常)也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免,
另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try ...catch)的异常。
如果不处理这类异常,集成开发环境中的编译器一般会给出错误提示。
Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别第1张

              注意:如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法名的后边,eg:  方法名() throws  IOExecption。

2:runtime exception(运行时异常),编译器不会检查这类异常,不检查的则开发者在代码的编辑编译阶段就不是必须处理,这类异常一般可以避免,因此无需处理(try ...catch),

  如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。    当出现这样的异常时,总是由虚拟机接管。

    eg:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 


 
 

免责声明:文章转载自《Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BPM实例分享:设置控件只读更换Sublime Text主题字体下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android开发记录

http://coffeelover.iteye.com/blog/1039470 一、Android模拟器相关 1. Android模拟器安装 Market 模拟器默认没有安装 Market,看到网上有较为复杂的安装方法,也有1个简单的,试了简单的,在 Android2.2 模拟器下试过是OK的,简单的方法如下:1) 下载2个文件:GoogleServ...

Vue-pdf实现在线预览PDF文件

前言 在大多数项目中都会遇到在线预览PDF文件,项目使用的是element ui,使用vue-pdf实现。 安装依赖 npm install --save vue-pdf 相关参数 参数介绍: url :pdf 文件的路径,可以是本地路径,也可以是在线路径。 page: 当前显示的页数,比如第一页page=1 rotate : 旋转角度,比如0就是不旋...

《ArcGIS Runtime SDK for Android开发笔记》

开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装 《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用 《Arc...

aarch64-linux-gnu交叉编译Qt4.7.3

到 Qt 官网下载合适的 Qt 版本,地址:http://download.qt-project.org/archive/qt/ 1.环境搭建: 1.安装automake、libtool 和主机上的 Qt 工具: $ sudo apt-get install automake autoconf libtool m4 $ sudo apt-get insta...

ArcEngine开发——许可问题

  在ArcGIS 10系列中,安装好ArcGIS Desktop和ArcObject SDK,获取软件授权就可以进行ArcObject开发了。在这个新版本的开发中,许可方式发生了一定的变化,此文对此做个讲述。 许可初始化   在ArcGIS 9.3中,对于所有单机应用程序(stand-alone applications),在运行ArcObjects组件...

Deep Learning部署TVM Golang运行时Runtime

Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型。TVM支持来自Tensorflow,Onnx,Keras,Mxnet,Darknet,CoreML和Caffe2等各种前端的模型编译。TVM编译模块可以部署在LLVM(Java...