阿里电话面试:java 异常处理

异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。

Java的可检测异常和非检测异常泾渭分明。可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则。

非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。有两个主要类定义非检测异常:RuntimeExceptionError

1.Error与Exception

Error子类属于非检测异常,这是因为无法预知它们的产生时间。若Java应用程序内存不足,则随时可能出现OutOfMemoryErrorThreadDeath;起因一般不是应用程序中的特殊调用,而是JVM自身的问题。另外,Error类一般表示应用程序无法解决的严重问题,故将这些类视为非检测异常。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

RuntimeException类也属于非检测异常,一个原因是普通JVM操作引发的运行时异常随时可能发生。与Error不同,此类异常一般由特定操作引发。但这些操作在Java应用程序中会频繁出现。例如,若每次使用对象时,都必须编写异常处理代码来检查null引用,则整个应用程序很快将变成一个庞大的try-catch块。因此,运行时异常不受编译器检查与处理或声明规则的限制。

RuntimeException类作为未检测异常还有一个原因:它们表示的问题不一定作为异常处理。可以在try-catch结构中处理NullPointerException,但若在使用引用前测试空值,则更简单,更经济。同样,可以在除法运算时检查0值,而不使用ArithmeticException

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

   运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生,编译器不认识的,在程序跑的时候会导致app挂掉。

   非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常,多为语法错误,我们的编译器显示红叉叉的东西。

结构如图:

  

3.try、catch、finally三个语句块应注意的问题
    第一、try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个。
    第二、try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
    第三、多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执

行别的catch块,并且匹配catch语句的顺序是由上到下。

4.throw、throws关键字
   throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。

   throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,看看如何使用这两个关键字:

Java代码  

1. public static void test3() throws Exception{  

2.       //抛出一个检查异常  

3.             throw new Exception("方法test3中的Exception");  

4. }   

 
    3、 Throwable类中的常用方法
    getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
    getMessage():返回异常的消息信息。
    printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 system.err 的值。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值