java中异常总结-值得一看

来源:互联网 发布:淘宝举报卖家怎么举报 编辑:程序博客网 时间:2024/05/22 18:43

本文要点:

1、Throwable把错误进一步划分为 java.lang.Exception 和 java.lang.Error.  java.lang.Error 用来处理系统错误
2、所有继承自RuntimeException的异常都被称为非检查型异常
3、只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。
4、finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用

首先看3张图片

 

 

 

 

1) Java中的Exception是什么?

       简单来说,异常是Java传达给你的系统和程序错误的方式。在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之类的类,然后还有一些处理异常时候的关键字,比如throw,throws,try,catch,finally之类的。 所有的异常都是通过Throwable衍生出来的。Throwable把错误进一步划分为 java.lang.Exception 和 java.lang.Error.  java.lang.Error 用来处理系统错误,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之类的。然后 Exception用来处理程序错误,请求的资源不可用等等。

2) Java中的检查型异常和非检查型异常有什么区别?

         检查型异常和非检查型异常的主要区别在于其处理方式。检查型异常需要使用try, catch和finally关键字在编译期进行处理,否则编译器会报错。对于非检查型异常则不需要这样做。Java中所有继承自java.lang.Exception类的异常都是检查型异常,所有继承自RuntimeException的异常都被称为非检查型异常

 

3) Java中的NullPointerException和ArrayIndexOutOfBoundException之间有什么相同之处?

         这两个异常都是非检查型异常,都继承自RuntimeException。该问题可能会引出另一个问题,即Java和C的数组有什么不同之处,因为C里面的数组是没有大小限制的,绝对不会抛出ArrayIndexOutOfBoundException。

4)在Java异常处理的过程中,你遵循的那些最好的实践是什么?

      1)能抛受控异常(checked Exception)就尽量不抛受非控异常(checked Exception)。通过去掉重复的异常处理代码,可以提高代码的可读性。

      2) 绝对不要让你的数据库相关异常显示到客户端。由于绝大多数数据库和SQLException异常都是受控异常,在Java中,你应该在DAO层把异常信息处理,然后返回处理过的能让用户看懂并根据异常提示信息改正操作的异常信息。

      3) 在Java中,一定要在数据库连接,数据库查询,流处理后,在finally块中调用close()方法。

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

        throw 和 throws乍看起来是很相似的尤其是在你还是一个java初学者的时候。尽管他们看起来相似,都是在处理异常时候使用到的。但在代码里的使用方法和用到的地方是不同的。throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常, 你也可以申明未检查的异常,但这不是编译器强制的。如果方法抛出了异常那么调用这个方法的时候就需要将这个异常处理。另一个关键字  throw 是用来抛出任意异常的,按照语法你可以抛出任意 Throwable (i.e. Throwable 或任何Throwable的衍生类) , throw可以中断程序运行,因此可以用来代替return . 最常见的例子是用 throw 在一个空方法中需要return的地方抛出 UnSupportedOperationException 代码如下 :

private static void show() {        throw new UnsupportedOperationException("Not yet implemented"); }


 

6) 什么是“异常链”? 

          “异常链”是Java中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。

7) 如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?

        这个问题也可以换个方式问:“如果在try或者finally的代码块中调用了System.exit(),结果会是怎样”。了解finally块是怎么执行的,即使是try里面已经使用了return返回结果的情况,对了解Java的异常处理都非常有价值。只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行

8)Java中final,finalize,finally关键字的区别

        final和finally是Java的关键字,而finalize则是方法。final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。而finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用。finally关键字是唯一一个和这篇文章讨论到的异常处理相关的关键字。在你的产品代码中,在关闭连接和资源文件的是时候都必须要用到finally块

9)下面的代码都有哪些错误:

 public static void start() throws IOException, RuntimeException{    throw new RuntimeException("Not able to Start"); } public static void main(String args[]) {    try {          start();    } catch (Exception ex) {            ex.printStackTrace();    } catch (RuntimeException re) {            re.printStackTrace();    } } 

           RuntimeException的超类,在start方法中所有的RuntimeException会被第一个捕捉异常块捕捉,这样就无法到达第二个捕捉块,这就是抛出“exception java.lang.RuntimeException has already been caught”的编译错误原因。

10)下面的代码都有哪些错误:


 

public class SuperClass {      public void start() throws IOException{        throw new IOException("Not able to open file");    }}public class SubClass extends SuperClass{      public void start() throws Exception{        throw new Exception("Not able to start");    }}


这段代码编译器将对子类覆盖start方法产生不满。因为每个Java中方法的覆盖是有规则的,一个覆盖的方法不能抛出的异常比原方法继承关系高。因为这里的start方法在超类中抛出了IOException,所有在子类中的start方法只能抛出要么是IOExcepition或是其子类,但不能是其超类,如Exception。

11)下面的代码都有哪些错误:

public static void start(){   System.out.println("Java Exception interivew question Answers for Programmers");}public static void main(String args[]) {   try{      start();   }catch(IOException ioe){      ioe.printStackTrace();   }}


上面的Java异常例子代码中,编译器将在处理IOException时报错,因为IOException是受检查异常,而start方法并没有抛出IOException,所以编译器将抛出“异常, java.io.IOException 不会在try语句体中抛出”,但是如果你将IOException改为Exception,编译器报错将消失,因为Exception可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。

 

 

原创粉丝点击