还不理解 Error 和 Exception 吗,看这篇就够了


还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
在 JAVA 中的基本理念是 结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对 Java 基本理念的理解就能发现问题 。但是编译期并不能找出所有的问题,有一些 NullPointerException 和 ClassNotFoundException 在编译期找不到,这些异常是 RuntimeException 运行时异常,这些异常往往在运行时才能被发现 。
我们写 Java 程序经常会出现两种问题,一种是 java.lang.Exception ,一种是 java.lang.Error,都用来表示出现了异常情况,下面就针对这两种概念进行理解 。
认识 ExceptionException 位于 java.lang 包下,它是一种顶级接口,继承于 Throwable 类,Exception 类及其子类都是 Throwable 的组成条件,是程序出现的合理情况 。
在认识 Exception 之前,有必要先了解一下什么是 Throwable 。
什么是 ThrowableThrowable 类是 Java 语言中所有错误(errors)和异常(exceptions)的父类 。只有继承于 Throwable 的类或者其子类才能够被抛出,还有一种方式是带有 Java 中的 @throw 注解的类也可以抛出 。
在Java规范中,对非受查异常和受查异常的定义是这样的:
The unchecked exception classes are the run-time exception classes and the error classes.
The checked exception classes are all exception classes other than the unchecked exception classes. That is, the checked exception classes are Throwable and all its subclasses other than RuntimeException and its subclasses and Errorand its subclasses.
也就是说,除了 RuntimeException 和其子类,以及error和其子类,其它的所有异常都是 checkedException 。
那么,按照这种逻辑关系,我们可以对 Throwable 及其子类进行归类分析
还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
可以看到,Throwable 位于异常和错误的最顶层,我们查看 Throwable 类中发现它的方法和属性有很多,我们只讨论其中几个比较常用的
// 返回抛出异常的详细信息public string getMessage();public string getLocalizedMessage();//返回异常发生时的简要描述public public String toString();// 打印异常信息到标准输出流上public void printStackTrace();public void printStackTrace(PrintStream s);public void printStackTrace(PrintWriter s)// 记录栈帧的的当前状态public synchronized Throwable fillInStackTrace();此外,因为 Throwable 的父类也是 Object,所以常用的方法还有继承其父类的getClass() 和 getName() 方法 。
常见的 Exception下面我们回到 Exception 的探讨上来,现在你知道了 Exception 的父类是 Throwable,并且 Exception 有两种异常,一种是 RuntimeException ;一种是 CheckedException,这两种异常都应该去捕获 。
下面列出了一些 Java 中常见的异常及其分类,这块面试官也可能让你举出几个常见的异常情况并将其分类
RuntimeException
还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
UncheckedException
还不理解 Error 和 Exception 吗,看这篇就够了

文章插图
 
与 Exception 有关的 Java 关键字那么 Java 中是如何处理这些异常的呢?在 Java 中有这几个关键字 throws、throw、try、finally、catch 下面我们分别来探讨一下
throws 和 throw在 Java 中,异常也就是一个对象,它能够被程序员自定义抛出或者应用程序抛出,必须借助于 throws 和 throw 语句来定义抛出异常 。
throws 和 throw 通常是成对出现的,例如
static void cacheException() throws Exception{throw new Exception();}throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理 。throws 语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理 。
throws 主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常 。throw 是具体向外抛异常的动作,所以它是抛出一个异常实例 。
try 、finally 、catch这三个关键字主要有下面几种组合方式 try...catch 、try...finally、try...catch...finally 。
try...catch 表示对某一段代码可能抛出异常进行的捕获,如下
static void cacheException() throws Exception{try {System.out.println("1");}catch (Exception e){e.printStackTrace();}}try...finally 表示对一段代码不管执行情况如何,都会走 finally 中的代码
【还不理解 Error 和 Exception 吗,看这篇就够了】static void cacheException() throws Exception{for (int i = 0; i < 5; i++) {System.out.println("enter: i=" + i);try {System.out.println("execute: i=" + i);continue;} finally {System.out.println("leave: i=" + i);}}}


推荐阅读