在Java中,根据错误性质将运行错误分为两类:错误和异常。
在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递Java运行时系统,这一异常的产生和提交过程称为抛弃(throw)异常。
当Java运行时系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这类异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。

1.Throwable类是 Java 语言中所有错误或异常的超类。它的两个子类是Error和Exception;

2.Error是Throwable
的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然   ThreadDeath
错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws
子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。

Error类包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理。

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

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

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

java.lang.OutOfMemoryError: Java heap space

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

  1. public static void main(String[] args) {
  2. method();
  3. }
  4.  
  5. public static void method() {
  6. while (true) {
  7. method();
  8. }
  9. }

无限次的递归调用出现

Exception in thread "main" java.lang.StackOverflowError

3.Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
有些异常在编写程序时无法预料的,如中断异常、非法存取异常等。为了保证程序的健壮性,Java要求必须对这些可能出现的异常进行捕获,并对其进行处理。

4.RuntimeException类是Exception类的子类。RuntimeException是那些可能在
Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在
throws 子句中进行声明。它是Exception的子类。

常见的运行时异常:

  1. try {
  2. String str = new String("AA");
  3. str = null;
  4. System.out.println(str.length());
  5. } catch (NullPointerException e) {
  6. e.printStackTrace();
  7. System.out.println("出现空指针的异常了");
  8. }
  9.  
  10.  
  11. try {
  12. Object obj = new Date();
  13. String str = (String) obj;
  14. } catch (ClassCastException e) {
  15. System.out.println("出现类型转换的异常了");
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. } finally {
  19. System.out.println("处理完异常后的逻辑");
  20. }
  21.  
  22.  
  23. try {
  24. int i = 10;
  25. System.out.println(i / 0);
  26. } catch (ArithmeticException e) {
  27. System.out.println("算术异常"+e.getMessage());
  28. }
  29.  
  30.  
  31.  
  32. try {
  33. int[] i = new int[10];
  34. System.out.println(i[-10]);
  35. } catch (ArrayIndexOutOfBoundsException e) {
  36. System.out.println("数组下标越界的异常!");
  37. }

5. IOExeption类是Exception类的子类。
从一个不存在的文件中读取数据
越过文件结尾继续读取

连接一个不存在的URL

    1. FileInputStream fis = null;
    2. try {
    3. fis = new FileInputStream(new File("hello1.txt"));
    4. int b;
    5. while ((b = fis.read()) != -1) {
    6. System.out.print((char) b);
    7. }
    8.  
    9. } catch (FileNotFoundException e1) {
    10. System.out.println("文件找不到了!");
    11. } catch (IOException e1) {
    12. System.out.println(e1.getMessage());
    13. } finally {
    14. try {
    15. fis.close();
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }

详解Java异常Throwable、Error、Exception、RuntimeException的区别的更多相关文章

  1. 详解 java 异常

    Throwable 可以用来表示任何可以作为异常抛出的类(注意,是类不是接口),分为两种: Error(注意!error也是可以throw的,但是不建议) 和 Exception. 其中 Error ...

  2. 详解Java Spring各种依赖注入注解的区别

    注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Comp ...

  3. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的

    本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...

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

    一:Error和Exception的基本概念: 首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕 ...

  5. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  6. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  7. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  8. 实例详解 Java 死锁与破解死锁

    锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...

  9. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

随机推荐

  1. LeetCode 206 Reverse Linked List(反转链表)(Linked List)(四步将递归改写成迭代)(*)

    翻译 反转一个单链表. 原文 Reverse a singly linked list. 分析 我在草纸上以1,2,3,4为例.将这个链表的转换过程先用描绘了出来(当然了,自己画的肯定不如博客上面精致 ...

  2. 【Python】向函数传递列表

    向函数传递列表 在实际使用中你会发现,向函数传递列表是比较实用的,这种列表可能包含名字.数字.可能更复杂的对象(字典) 假设向一个函数传递一堆水果,我们说出我们喜欢所有的水果 def Obj(frui ...

  3. mysql MHA报错 Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 99.

    如果发现如下错误: Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MH ...

  4. 双向数据绑定---AngularJS的基本原理学习

    Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJS非 ...

  5. 对Oracle的rownum生成时机的理解

    在Oracle中,rownum和rowid是平时经常用到的.比如rownum经常用于分页查询,rowid用于排重或者快速定位到记录. 对rownum跟order by配合下的生成时机一直没有具体研究过 ...

  6. window+Jira+SQL Server

    window下Jira+SQL Server部署+汉化+破解(亲测2018.5) 网上很多都是jira+mysql部署的文章,由于我现在有需求要用SQL Server数据库,因此就动手试了一下,参考网 ...

  7. 未加载Microsoft.SqlServer.management.sdk.sfc version......

    这个问题卡了我好久,于是决定记录下来,我这里缺失的是Microsoft.SqlServer.management.sdk.sfc version 12.0.0,当然你也可能后面是11开头的, 这个是由 ...

  8. matlab biplot 符号的困惑

    在matlab中做Principal component Analysis 时,常要用biplot 函数来画图,表示原分量与主分量(principal component)之间的关系,以及原始观察数据 ...

  9. FAT12中,如何定位大于一个扇区(512B)的文件内容

    [0]README 0.1)本文旨在于 演示在FAT12中, 如何取定位大于 512B 的文件内容,和查看它: 0.2)如何制作FAT12文件系统,以及如何向文件中添加temp.txt文件,参见: { ...

  10. Java线程:概念及原理

    线程是执行的程序中的一个线程. Java虚拟机允许应用程序必须同时运行多个执行线程. 每个线程都有一个优先事项.具有更高优先级的线程优先于线程的优先级较低的执行.每个线程可能会或可能不会也被标记为一个 ...