异常

2019-05-26  本文已影响0人  崽子猪

一、异常体系

什么是异常?

异常就是程序中的一些错误,但并不是所有的错误都是异常

例如:输入了非法程序/打开了不存在的文件/网络通信时连接中断/JVM内存溢出/OOM等

这些异常大多数是我们开发人员出错误所引起的,还有一部分错误是我们程序本身引起的

异常分类

    1.error(错误) / Exception(异常)

     error:表示我们程序当中无法处理的错误( OOM / 线程写成死亡导致的错误) 一般发生error错误的时候,JVM虚拟机会选择线程终止

     Exception的(运行时异常/非运行时异常):表示程序本身可以处理的异常

    2.运行时异常和非运行时异常

        运行时异常:大多数分为RunTimeException以及它的子类(空指针异常/数组下标越界异常) 这些异常是不检查的异常,可以选择try/catch 也可以选择不处理

        非运行时异常:除了我们运行时异常以外的异常都是非运行时异常(IOException/SQLException/自定义的一些Exception.从程序语法角度上说是必须处理的异常.如果不处理程序是编译不通过的. 

    在Java当中我们是把异常当作对象来处理的,定义了一个基类,是所有异常的超类.

二、异常使用    

       1.运用Java异常处理机制

            1)try....catch语句(表示在try代码块中抛出异常之后,立即会转到catch代码块中执行或者退到栈的上一次代码中去寻找catch代码块)

            2)finally语句:任何情况下都必须执行的代码(由于异常会强制中断正常流程. finally语句的执行都是在try....catch语句后面,这样也保证了这样的操作会被执行.[缺点:由于finally和try...catch代码块是相互孤立开的,所以程序结构比较松散,可读性比较差,影响程序的建造性])

            3)throws子句:声明可能会出现的异常(只能在方法声明处)

            4)throw语句:抛出异常(可以在各个地方都可以抛出异常)

       2.异常处理的原理

            1)Java虚拟机用方法调用栈(method invovation)来跟踪每个线程中一系列的方法调用过程.

            2)如果执行方法中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块

            3)当Java虚拟机追溯刀调用栈的底部方法时,如果仍然没有找到处理该异常的代码块

       3.异常流程的运行过程

1)finally语句不被执行的唯一情况就是先执行了用于终止程序的System.exit()方法

2)return语句用于退出本方法

3)finally代码块虽然在return语句之前就被执行但是变量修改不会影响我们的返回值

4)建议不要再finally代码块中使用return语句


第一种场景代码
第二种场景代码 第三种场景代码
第四种场景代码

三、一些异常得面试题

1.Java中的检查异常和非检查异常有什么区别?

      可检查异常:经编译器验证,对于声明抛出异常的方法.编译器将强制执行处理并声明规则.

      非检查异常(error):不遵循处理和声明规则.在产生子类异常时,不一定要采取任何适当操作.编译器不会去走是否解决了这样的异常

2.throw 和 throws 这两个关键字在java中有什么不同?

throw:总是出现在函数体内.在程序运行中抛出的一个拒绝的异常Expection,它抛出的Expection需要我们的代码人员来捕获处理

throws:总是出现在函数头当中.声明方法抛出的所有异常表示这个方法不能处理所有通过sevrice这个方法来抛出异常

3.如果执行finall代码块之前方法放回了结果,或者JVM退出了,finally块中俄代码还会执行吗?

1)在try代码块之外异常或者放回不是执行finally代码块的

2)在执行try代码块时退出JVM虚拟机

3)在子线程中执行try代码块时突然退出线程

4.Java中final,finalize,finally关键字的区别?

    final:被修饰的类,不能被继承,方法不能重写,变量变成常量,

    finally:用于异常处理,执行清除操作。

    finanlize:在垃圾收集器删除,对象之前调用此方法

上一篇 下一篇

猜你喜欢

热点阅读