在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. 如何把VBS转换为EXE文件

    如下所示,我想要做一个把360网速测试剥离开来的绿色版,有一个TestSpeed.bat命令,双击之后去执行了360AppLoader.exe,并且会调用netmon文件夹的NetSpeed.dll文 ...

  2. GTD实用指南

    以前通过余弦大牛博客接触到了GTD, 后来我自己接触之后呢, 我是非常讨厌GTD的, 因为太功利化了 反人类 我还是比较懒得··· 可是最近事情真的比较多,不得不做GTD了 = =  郁闷! 时间管理 ...

  3. vs code编辑器

    1.vs code配置 { "editor.tabSize": 2, "workbench.startupEditor": "newUntitledF ...

  4. 如何让DIV居中

    总结:text-align:center;对三中浏览器而言,都具有文字/行内元素的嵌套式居中,或者说继承式的居中,只要外面的容器设置了这个属性,那么他内部的所有元素都具有这个属性(意思是,虽然这个属性 ...

  5. nginx+keepalived实现双机热备高可用性

    搭建准备: 机器两台 ip分别为192.168.100.128 192.168.100.129(能够用虚拟机測试.虚拟机网络模式为NET模式.且为静态ip) 另外须要准备一个虚拟ip对外提供服务.即通 ...

  6. 分享下多年积累的对JAVA程序员成长之路的总结

    http://blog.csdn.net/zhongzelin/article/details/8643269我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱 ...

  7. (八)jQuery中的事件

    1.加载DOM在常规的JavaScript中,使用window.onload方法:而在jQuery中,使用$(document).ready(function(){ })方法.window.onloa ...

  8. python学习(三)数字类型示例

    奶奶的报了这个错,我以为可以像java中字符串加数字的嘛 Traceback (most recent call last):   File "./number.py", line ...

  9. CentOS下安装python3.x版本

    现在python都到了3.x版本,但是centos中自带的python仍然是2.7版本的,所以想把python换成3.x版本的. 但是这个地方有个坑,你要是直接编译安装了python3.x之后,估计你 ...

  10. Mongodb亿级数据量的性能测试

    进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目:   (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ...