异常相关面试题

  • 1 Java 中的 Exception 是什么?
  • 2 Java 中的检查型异常和非检查型异常有什么区别?
  • 3 Java 中的 NullPointerException 和ArrayIndexOutOfBoundException 之间有什么相同之处?
  • 4 在 Java 异常处理的过程中,你遵循的那些最好的实践是什么?
  • 5 既然我们可以用 RuntimeException 来处理错误,那么你认为为什么 Java 中还存在检查型异常?
  • 6 throw 和 throws 这两个关键字在 java 中有什么不同?
  • 7 什么是“异常链”?
  • 8 你曾经自定义实现过异常吗?怎么写的?
  • 9 JDK7 中对异常处理做了什么改变?
  • 10 你遇到过 OutOfMemoryError 错误嘛?你是怎么搞定的?
  • 11 如果执行 finally 代码块之前方法返回了结果,或者 JVM 退出了,finally 块中的代码还会执行吗?
  • 12 Java 中 final,finalize,finally 关键字的区别
  • 13 下面的代码都有哪些错误:
  • 14 下面的 Java 代码都有哪些错误:
  • 15 下面的 Java 异常代码有什么错误:

1 Java 中的 Exception 是什么?

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

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

这又是一个非常流行的 Java 异常面试题,会出现在各种层次的 Java 面试中。

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

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

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

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

这个问题在面试技术经理是非常常见的一个问题。因为异常处理在项目设计中是非常关键的,所以精通异常处理是十分必要的。异常处理有很多最佳实践,下面列举集中,它们提高你代码的健壮性和灵活性:

  1. 调用方法的时候返回布尔值来代替返回 null,这样可以 NullPointerException。由于空指针是 java 异常里最恶心的异常,你可以参考技术文章 coding best practices to minimize NullPointerException。去看看里面具体的例子。
  1. catch 块里别不写代码。空 catch 块是异常处理里的错误事件,因为它只是捕获了异常,却没有任何处理或者提示。通常你起码要打印出异常信息,当然你最好根据需求对异常信息进行处理。
  2. 能抛受控异常(checked Exception)就尽量不抛受非控异常(checked Exception)。通过去掉重复的异常处理代码,可以提高代码的可读性。
  3. 绝对不要让你的数据库相关异常显示到客户端。由于绝大多数数据库和SQLException 异常都是受控异常,在 Java 中,你应该在 DAO 层把异常信息处理,然后返回处理过的能让用户看懂并根据异常提示信息改正操作的异常信息。
  4. 在 Java 中,一定要在数据库连接,数据库查询,流处理后,在 finally 块中调用close()方法。

5 既然我们可以用 RuntimeException 来处理错误,那么你认为为什么 Java 中还存在检查型异常?

这是一个有争议的问题,在回答该问题时你应当小心。虽然他们肯定愿意听到你的观点,但其实他们最感兴趣的还是有说服力的理由。我认为其中一个理由是,存在检查型异常是一个设计上的决定,受到了诸如 C++等比 Java 更早的编程语言设计经验的影响。绝
大多数检查型异常位于 java.io 包内,这是合乎情理的,因为在你请求了不存在的系统资源的时候,一段强壮的程序必须能够优雅的处理这种情况。通过把 IOException 声明为检查型异常,Java 确保了你能够优雅的对异常进行处理。另一个可能的理由是,可以使用catch 或 finally 来确保数量受限的系统资源(比如文件描述符)在你使用后尽早得到释放。

Joshua Bloch 编写的 Effective Java 一书 中多处涉及到了该话题,值得一读。

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

一个 java 初学者应该掌握的面试问题。

throw 和 throws 乍看起来是很相似的尤其是在你还是一个 java 初学者的时候。尽管他们看起来相似,都是在处理异常时候使用到的。但在代码里的使用方法和用到的地方是不同的。

throws 总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常, 你也可以申明未检查的异常,但这不是编译器强制的。如果方法抛出了异常那么调用这个方法的时候就需要将这个异常处理。

另一个关键字 throw 是用来抛出任意异常的,按照语法你可以抛出任意 Throwable (i.e. Throwable 或任何 Throwable 的衍生类) , throw 可以中断程序运行,因此可以用来代替 return . 最常见的例子是用 throw 在一个空方法中需要 return 的地方抛出UnSupportedOperationException 代码如下 :

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

7 什么是“异常链”?

“异常链”是 Java 中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者 RuntimeException。

顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过 getCause()和 initCause()方法来访问异常最终的根源。

8 你曾经自定义实现过异常吗?怎么写的?

很显然,我们绝大多数都写过自定义或者业务异常,像 AccountNotFoundException。

在面试过程中询问这个 Java 异常问题的主要原因是去发现你如何使用这个特性的。这可以更准确和精致的去处理异常,当然这也跟你选择 checked 还是 unchecked exception 息息相关。通过为每一个特定的情况创建一个特定的异常,你就为调用者更好的处理异常提供了更好的选择。

相比通用异常(general exception),我更倾向更为精确的异常。大量的创建自定义异常会增加项目 class 的个数,因此,在自定义异常和通用异常之间维持一个平衡是成功的关键。

9 JDK7 中对异常处理做了什么改变?

JDK7 中对错误(Error)和异常(Exception)处理主要新增加了 2 个特性,一是在一个 catch 块中可以出来多个异常,就像原来用多个
catch 块一样。另一个是自动化资源管理(ARM), 也称为 try-with-resource 块。这 2 个特性都可以在处理异常时减少代码量,同时提高代码的可读性。对于这些特性了解,不仅帮助开发者写出更好的异常处理的代码,也让你在面试中显的更突出。

10 你遇到过 OutOfMemoryError 错误嘛?你是怎么搞定的?

这个面试题会在面试高级程序员的时候用,面试官想知道你是怎么处理这个危险的OutOfMemoryError 错误的。

必须承认的是,不管你做什么项目,你都会碰到这个问题。
所以你要是说没遇到过,面试官肯定不会买账。要是你对这个问题不熟悉,甚至就是没碰到过,而你又有 3、4 年的 Java 经验了,那么准备好处理这个问题吧。在回答这个问题的同时,你也可以借机向面试秀一下你处理内存泄露、调优和调试方面的牛逼技能。我发现掌握这些技术的人都能给面试官留下深刻的印象。建议阅读文章 how to fix java.lang.OutOfMemoryError

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

这个问题也可以换个方式问:“如果在 try 或者 finally 的代码块中调用了System.exit(),结果会是怎样”。

了解 finally 块是怎么执行的,即使是 try 里面已经使用了 return 返回结果的情况,对了解 Java 的异常处理都非常有价值。只有在 try 里面是有System.exit(0)来退出 JVM 的情况下 finally 块中的代码才不会执行。

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

final 和 finally 是 Java 的关键字,而 finalize 则是方法。

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

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

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 类型变量“re”里抛出编译异常错误。

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

14 下面的 Java 代码都有哪些错误:

public classSuperClass {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。

15 下面的 Java 异常代码有什么错误:

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 可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。我喜欢这样带有迷惑性的 Java 异常面试题,因为它不会让人轻易的找出是 IOException 还是 Exception。你也可以在 Joshua Bloach 和 Neil Gafter 的 Java 谜题中找到一些有关 Java 错误和异常的具有迷惑性问题。

再抛出一个问题:“为什么 Java 异常被认为是比返回错误代码要好”

Java面试题-异常相关推荐

  1. java中必检异常有哪些_Java面试题经典面试题220道(附答案)

    Java基础: 1.JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么?== 解读 3. 两个对象的 hashCode() 相同, 那么 equals() 也一定为 true ...

  2. 【Java面试】异常常见面试题

    文章目录 1. Error 和 Exception 区别是什么? 运行时异常和一般异常(受检异常)区别是什么? JVM 是如何处理异常的? throw 和 throws 的区别是什么? final.f ...

  3. java 实体类包含list 怎么取值_2019 最新 500 道 Java 面试题

    2015 年,因为工作岗位的变动,开始负责给集团招聘一些技术人员,出于对公司的负责,也为了更好的胜任技术经理的职位,在面试的这件事上,我做了大量的"功课",首先我研究了几乎所有大厂 ...

  4. java面试题2019 答案

    Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ...

  5. Java面试题汇总及答案2021最新(序列化含答案)

    Java面试题汇总及答案2021最新(序列化含答案) 为大家整理了2021最新的Java面试题及答案下载,这套Java面试题总汇已经汇总了Java基础面试到高级Java面试题,几乎涵盖了作为一个Jav ...

  6. Java面试题及答案整理(2022年140道)持续更新

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Jav ...

  7. Java面试题及答案整理(2022最新版) 持续更新

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Jav ...

  8. Java面试题大全带答案 110道(持续更新)

    本人发现网上虽然有不少Java面试题大全带答案,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案 如果不背 ...

  9. Java面试题及答案整理( 2022最新版,持续更新)

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ Java面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少 ...

最新文章

  1. js 截取 前后 空格 获取字符串长度
  2. mysql 创建用户权限_10.创建 MySQL 用户及赋予用户权限
  3. TiDB 在小米的应用实践
  4. Linux下Mail命令收集
  5. wordpress支持MySQL5.5_CentOS 5.5安装Nginx、PHP(FastCGI)、MySQL --搭建LNMP环境安装Wordpress...
  6. cuSPARSE库:(十七)cusparseStatus_t 返回信息
  7. 【网络安全工程师面试合集】—如何利用Http协议入侵网站
  8. qt中如何模拟按钮点击_怎么在qt中实现一个按钮列表?
  9. 案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变...
  10. 电力拖动自动控制系统_一、自动化专业电气工程及其自动化
  11. python建立ARIMA模型进行时间序列分析(氵论文)
  12. Unity_触摸屏_720全景制作
  13. 苹果手机内存不够白屏
  14. 广州成人大学哪个学校最好
  15. Python画出时钟
  16. 类和对象的概述及二者之间的关系
  17. sql 中or与in的查询效率对比
  18. Flask-peewee-pyjwt实现简单的用户接口
  19. CCPC-Wannafly Winter Camp Day1部分题目解析
  20. html行内块元素对齐,如何通过显示行内块将元素对齐到右侧?

热门文章

  1. APP测试面试题要点
  2. 中山市事业编计算机类专业知识题目,中山大学计算机历年复试面试考研试题合集(4)...
  3. [C++] 动态内存分配
  4. 基于圆内接三角形的快速高精圆检测
  5. Rockchip Android平台常用调试命令汇总
  6. APP运营的三大核心内容
  7. 这次引起程序员恐慌的竟然是网易云音乐
  8. 377-379自制mac系统 (李游精品前端课程笔记)
  9. 每天不知道吃啥?Python来告诉你!生成菜谱,每天吃啥不用愁
  10. 跨站脚本攻击(XSS)分类介绍及解决办法