深入java 异常

这篇文章总结一下java的异常用法,常见得java异常以及例子说明。更多的源代码请访问我的github:https://github.com/yangsheng20080808/deepIntoJava

原创不易,转载请声明出处。

本文分为3大部分

  • java异常基本用法
  • Error错误
  • 第一类异常:RuntimeException运行时异常
  • 常见运行时异常的例子
  • 第二类异常:CheckedException编译异常
  • 常见编译异常的例子
  • 编译异常我们常用处理方法

java异常基本用法

读大学的时候上java课程,老师说java其中一个很强的功能就是异常处理,C++是没有异常处理的,今天自己写一篇文章,总结对java异常的学习和使用。其实这篇文章还是偏向于简单,希望可以跟大家共享一些知识吧。

我们先看一下java异常的家族图谱:当然这个图是很不完整的(该图摘自:http://blog.csdn.net/zhangerqing/article/details/8248186)。
这里写图片描述

顶级父类:在 Java 中,所有的异常都有一个共同的祖先 Throwable类(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。

Throwable:是异常体系的父类,他有两个子类:Error和Exception。

Error错误:

Error类是一些严重的系统错误,这些错误一般与硬件相关,例如:内存溢出、虚拟机错误、栈溢出等,通常由系统去进行处理,这些错误我们写的程序是不能去捕获和处理。(我们无需关心这些错误。)。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止,这些错误是不可查的。
常见的错误如下:
这里写图片描述

Exception:*对于Exception;我们只要分为两大类就可:第一类异常:RuntimeException运行时异常;第二类异常:CheckedException编译异常*

RuntimeException运行时异常:

对于运行时异常,想必很容易理解,就是当程序运行的过程中突然发生了异常是吧,当你还可能摸不着头脑的时候,啪啪啪异常的堆栈信息就打印了一大堆。对于这一类异常,我只想说:以为是运行的时候发生的,我们在程序中可能没有预想到会发生这种异常,所以可能我们并没用在写程序的时候就考虑到这一类情况,当然啦:可能我们就没有在程序中对这一类异常进行处理(当然,其实我们也有可能):已经对这一类异常进行了处理。
上面说到了我们在编程时可能发生的异常:其实总结起来就是:运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。出现异常被抛给JVM,JVM打印出异常跟踪栈。
想要避免这种错误:需要我们在写代码的时候去注意。

我们引用网上一张图片说明:(这张图片基本涵盖了所有运行时异常):
RuntimeException

我们下面一个一个例子给大家举例:(源代码在github上的deepIntoJava仓库)

常见运行时异常的例子

例子1:除数为0的算数异常
这里写图片描述
运行结果分别是:(我们可以在编写代码的时候避免这些错误)
这里写图片描述
这里写图片描述

例子2:访问数组的下标越界异常
这里写图片描述
三次测试结果分别为:
这里写图片描述
这里写图片描述
这里写图片描述

还有其他的异常大家想看举例子的话直接去我的git上看一下源代码就好,就不在这里一一列举了。总结:到这里我们发现RuntimeException运行时异常,编译器在编译的时候是不会提示的,如果我们想避免这种异常,需要我们在写代码的时候去注意,当然啦,如果我们写的时候没有注意,jdk也会在程序运行的时候用很清晰的方式给我们提示。

CheckedException编译异常:

对于编译异常,想必很容易理解,就是当程序还没有运行,IDE和JDK会预料到你的这些操作很可能会发生一场,要求你必须采取一些方法去处理,避免整个程序挂掉。对于这一类异常,我只想说:如果你没有去处理,ou,你的程序根本不能运行起来。
上面说到了我们在编程时可能发生的异常:其实总结起来就是:编译异常的特点是Java编译器会检查它,也就是说,当程序中出现这类异常,如果没有用try-catch语句捕获它,也没有用throws子句声明抛出它,编译无法通过。

我们引用网上一张图片说明:(这张图片基本涵盖了所有编译异常):
这里写图片描述

常见编译异常的例子

如果出现了编译异常,我们不适用try…catch…或者抛出的话,程序无法编译通过。
例子1:文件没找到异常
这里写图片描述
我们可以捕获这个异常或者直接处理掉(try…catch…)
这里写图片描述
再多的例子我们就不举啦。

编译异常我们常用处理方法

1:try…catch…
如果有编译异常,我们可以用try…catch…语句尝试去解决。例如上面的将猫变狗的例子:
这里写图片描述
关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域。Java方法在运行过程中出现异常,则创建异常对象。将异常抛出监控区域之 外,由Java运行时系统试图寻找匹配的catch子句以捕获异常。若有匹配的catch子句,则运行其异常处理代码,try-catch语句结束。

匹配的原则是:如果抛出的异常对象属于catch子句的异常类,或者属于该异常类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配。

2 : try…catch…finally
try-catch语句还可以包括第三部分,就是finally子句。它表示无论是否出现异常,都应当执行的内容。

3 : throw
throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。

1) 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。我们可以不关心

2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,要么先try-catch尝试去处理,如果还是处理不了再抛出。否则会导致编译错误

3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。

4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

5 ) 如果在catch里面继续抛出,我们就不需要处理返回值,如果不抛出,程序会以为我们的处理完了异常,程序回到正常的逻辑,是需要我们提供返回值的
。例如:
这里写图片描述
或者继续抛出:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值