详解Java异常Throwable、Error、Exception、RuntimeException的区别
在Java中,根据错误性质将运行错误分为两类:错误和异常。
在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递Java运行时系统,这一异常的产生和提交过程称为抛弃(throw)异常。
当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这类异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。
1.Throwable类是 Java 语言中所有错误或异常的超类。它的两个子类是Error和Exception;
2.Error是Throwable
的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath
错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws
子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。
Error类包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理。
1)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
2)java.lang.StackOverflowError
堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
- public static void main(String[] args) {
- method();
- }
- public static void method() {
- while (true) {
- method();
- }
- }
无限次的递归调用出现
Exception in thread "main" java.lang.StackOverflowError
3.Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
有些异常在编写程序时无法预料的,如中断异常、非法存取异常等。为了保证程序的健壮性,Java要求必须对这些可能出现的异常进行捕获,并对其进行处理。
4.RuntimeException类是Exception类的子类。RuntimeException是那些可能在
Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在
throws 子句中进行声明。它是Exception的子类。
常见的运行时异常:
- try {
- String str = new String("AA");
- str = null;
- System.out.println(str.length());
- } catch (NullPointerException e) {
- e.printStackTrace();
- System.out.println("出现空指针的异常了");
- }
- try {
- Object obj = new Date();
- String str = (String) obj;
- } catch (ClassCastException e) {
- System.out.println("出现类型转换的异常了");
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- System.out.println("处理完异常后的逻辑");
- }
- try {
- int i = 10;
- System.out.println(i / 0);
- } catch (ArithmeticException e) {
- System.out.println("算术异常"+e.getMessage());
- }
- try {
- int[] i = new int[10];
- System.out.println(i[-10]);
- } catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("数组下标越界的异常!");
- }
5. IOExeption类是Exception类的子类。
从一个不存在的文件中读取数据
越过文件结尾继续读取
连接一个不存在的URL
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(new File("hello1.txt"));
- int b;
- while ((b = fis.read()) != -1) {
- System.out.print((char) b);
- }
- } catch (FileNotFoundException e1) {
- System.out.println("文件找不到了!");
- } catch (IOException e1) {
- System.out.println(e1.getMessage());
- } finally {
- try {
- fis.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
详解Java异常Throwable、Error、Exception、RuntimeException的区别的更多相关文章
- 详解 java 异常
Throwable 可以用来表示任何可以作为异常抛出的类(注意,是类不是接口),分为两种: Error(注意!error也是可以throw的,但是不建议) 和 Exception. 其中 Error ...
- 详解Java Spring各种依赖注入注解的区别
注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Comp ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别
一:Error和Exception的基本概念: 首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕 ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- 详解java动态代理机制以及使用场景
详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
随机推荐
- js 扩展replaceAll
//扩展replaceAll; String.prototype.replaceAll = function(s1,s2) { return this.replace(new RegExp(s1,&q ...
- 智能手机的耗电特征及APP耗电量测试的两种方法
文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...
- JavaScript--基于对象的脚本语言学习笔记(一)
1.两种嵌入js的方式 使用javascript前缀构建url:<a href="javascript:alert('执行JavaScript. .')">执行j ...
- 读懂JVM垃圾收集日志
JVM垃圾收集搞懂原理很重要,但是连垃圾收集的日志都不懂,这tmd还分析个屁的问题啊,典型的空有理论知识,动手实践为零.本篇就来具体的学习一下JVM中的垃圾收集日志. 第一步,垃圾收集的选项 图1 J ...
- FreeRTOS在神舟IV号开发板的应用demo
下面一个可以直接编译运行的例子,FreeRTOS的版本是V7.1.0,芯片是STM32F107VCT6,使用的开发环境是Keil uVision5. 这里例子创建了四个任务,每个任务控制一个LED的亮 ...
- JavaScript -- 没事看看
@.delete 原文:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete
- shell 获取当前svn代码目录版本号
在当前svn代码目录下执行以下命令: svn info | grep "Last Changed Rev:" | awk -F ': ' '{print $2}' > svn ...
- 机器学习中的EM算法具体解释及R语言实例(1)
最大期望算法(EM) K均值算法很easy(可參见之前公布的博文),相信读者都能够轻松地理解它. 但以下将要介绍的EM算法就要困难很多了.它与极大似然预计密切相关. 1 算法原理 最好还是从一个样例開 ...
- H2 应用实例1
说明:本例子开发工具为NetBeans,jdk 1.7 进行测试说明 H2安装说明如下 1. H2数据库必要文件下载地址为: http://www.h2database.com (1) 下载截 ...
- 九度OJ 1178:复数集合 (插入排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8393 解决:1551 题目描述: 一个复数(x+iy)集合,两种操作作用在该集合上: 1.Pop 表示读出集合中复数模值最大的那个复数,如 ...