您现在的位置是:网站首页>博客详情博客详情

Java异常

边小丰2019年01月30日 Java基础 606人已围观


摘要: 异常:程序在运行的过程中,如果程序执行出错,阻止了程序的正常运行,那么就会产生异常。而在Java中有一套解决方案,这就是异常处理机制。Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运行,但是,由于入参、程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补充,就是为了更好的处理意料之外的结果。


前言

在面试的过程中一般会问道关于Java的异常处理相关的内容,异常处理是一般容易被忽略的,但是确是很考验一个程序员功底的方面。本文会介绍关于异常,以及关于异常的面试会问到的一些问题。

异常的分类

异常:程序在运行的过程中,如果程序执行出错,阻止了程序的正常运行,那么就会产生异常。而在Java中有一套解决方案,这就是异常处理机制。Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运行,但是,由于入参、程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补充,就是为了更好的处理意料之外的结果。

首先说第一点:

所有的异常类的父类是throwable,这个出现在我的笔试题上面,是一道判断题,但是当时没有回答正确。



通过以上两张图就能看到Exception和Error的直接父类是Throwable,而Throwable是实现了Serializable接口,Object的子类。

以上就是它们三者的关系。

首先具体说下Exception。

Exception的分类

Java中的异常分为两大类:

  • Checked Exception (受检异常,也叫非运行时异常)
  • Unchecked Exception (也叫RuntimeException,运行时异常)

所有的运行时异常都是直接或者间接的继承自RuntimeException类的,比如下面图中的空指针异常。


凡是没有继承RuntimeException而是直接继承的Exception的,叫做受检异常。
比如IO异常。


接下来具体的说明这些异常:


其他要说的:

Checked Exception

对于Checked Exception ,Java要求程序员对这样的操作进行预处理。即用try、catch、finally或者throws,要么在方法中使用TCF三连,或者直接抛出交给他的上一级进行处理。

对于这样的情况是必须要进行处理的,如果不进行处理,程序都不能被编译。

比如常见的加载驱动:
Class.forName("xxx")就必须要进行处理,否则会抛出ClassNotFoundException受检异常,不处理是不能通过编译的。

Unchecked Exception

对于Unchecked Exception来说,一般是不需要进行处理的,程序能正常的通过编译。但是为了程序的严谨性,一般还是会在可能发生异常的地方进行TCF三连处理。这类异常常见的如下:
* ArithmeticException 算术异常
* NullPointerException 空指针异常
* ClassCastException 类转换异常
* ArrayIndexOutOfBoundsException 数组索引越界异常

OK,再说下异常的捕获,关于异常,**一般是先捕获小的异常(子类),再捕获大的异常(父类)**。一般是不建议直接用Exception来全给捕获了。

最后加一个面试题:

 public void testException1() {
        try {
            System.out.println("In try first");
            int i = 3 / 0;
            System.out.println("In try");
            return;
        } catch (ArithmeticException a) {
            System.out.println("In catch");
        }finally {
            System.out.println("In finally");
        }
         System.out.println("In end");
    }
    public void testException2() {
        try {
            int i = 3 / 0;
            System.out.println("In try");
            return;
        } catch (ArithmeticException a) {
            System.out.println("In catch");
        }finally {
            System.out.println("In finally");
            return;
        }
         System.out.println("In end");        
    }

关于以上的代码,可以自己打断点看一下运行过程:

结论如下:

1、在TCF语句中,try部分的代码如果产生了异常,会被catch到然后转入catch语句块中进行处理,最后调用finally语句块(如果有的话)进行最后的资源清理等等工作。

2、但是如果在finally语句块中有return语句,那么是不会再执行下面的语句的。


__EOF__

作  者Dimple
出  处/view/25
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击下方的鼓掌一下。您的鼓励是博主的最大动力!如有疑问请留言!


文章评论

我的名片

网名:Dimple | 裤兜有怪兽

职业:Java开发工程师

现居:四川省-成都市

Email:bianxiaofeng@sohu.com

每日一句

最近更新

点击排行

猜你喜欢