Java中什么是Exception?

所有的异常都是通过Throwable衍生出来的。Throwable把错误进 一步划分为 java.lang.Exception 和 java.lang.Error. java.lang.Error 用来处理系统错误,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之类的。然后 Exception用来处理程序错误,请求的资源不可用等等。

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

这又是一个非常流行的Java异常面试题,会出现在各种层次的Java面试中。检查型异常和非检查型异常的主要区别在于其处理方式。检查型异常需要使用 try, catch和finally关键字在编译期进行处理,否则会出现编译器会报错。对于非检查型异常则不需要这样做。Java中所有继承自 java.lang.Exception类的异常都是检查型异常,所有继承自RuntimeException的异常都被称为非检查型异常。你也可以查看 下一篇文章来了解 更多关于检查型异常和非检查型异常之间的区别。

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

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

1) 调用方法的时候返回布尔值来代替返回null

这样可以 避免发生NullPointerException。由于空指针是java异常里最恶心的异常,你可以参考一下下面的技术文章 coding best practices to minimize NullPointerException。去看看里面具体的例子。

2) catch块里别不写代码。

空catch块是异常处理里的错误事件,因为它只是捕获了异常,却没有任何处理或者提示。通常你起码要打印出异常信息,当然你最好根据需求对异常信息进行处理。

3)优先选择非检查型异常。

通过去掉重复的异常处理代码,可以提高代码的可读性。(boilerplate是样板文件的意思,可理解为是拷贝重复之一)
请找到合适的理由

4) 绝对不要让你的数据库相关异常显示到客户端。

由于绝大多数数据库和SQLException异常都是检查型异常,应该在应用的dao层处理这些异常,返回一些值,或者返回有意义的运行时(非检查型)异常,像这样客户端才能理解,并采取一些措施。

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

我已经在我的文章Top 10 Java exception handling best practices中分享了关于这方面的很多知识,你们也可以看看这篇文章。

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

  • 这是一个有争议的问题
  • 存在 检查型异常是一个设计上的决定,受到了诸如C++等比Java更早的编程语言设计经验的影响。绝大多数检查型异常位于java.io包内,这是合乎情理 的,因为在你请求了不存在的系统资源的时候,一段强壮的程序必须能够优雅的处理这种情况。通过把IOException声明为检查型异常,Java 确保了你能够优雅的对异常进行处理。(资源紧张一般涉及到IO异常比较多)
  • 可以使用catch或finally来确保数量受限的系统资源(比如文件描述符)在你使用后尽早 得到释放。 Joshua Bloch编写的 Effective Java 一书 中多处涉及到了该话题,值得一读。

什么是“异常链”?

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

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

很显然,我们绝大多数都写过自定义或者业务异常,像AccountNotFoundException。在面试过程中询问这个Java异常问题的主要原因 是去发现你如何使用这个特性的。这可以更准确和精致的去处理异常,当然这也跟你选择checked 还是unchecked exception息息相关。通过为每一个特定的情况创建一个特定的异常,你就为调用者更好的处理异常提供了更好的选择。相比通用异常(general exception),我更倾向更为精确的异常。大量的创建自定义异常会增加项目class的个数,因此,在自定义异常和通用异常之间维持一个平衡是成功 的关键。

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

这个面试题会在面试高级程序员的时候用,面试官想知道你是怎么处理这个危险的OutOfMemoryError错误 的。必须承认的是,不管你做什么项目,你都会碰到这个问题。所以你要是说没遇到过,面试官肯定不会买账。要是你对这个问题不熟悉,甚至就是没碰到过,而你 又有3、4年的Java经验了,那么准备好处理这个问题吧。在回答这个问题的同时,你也可以借机向面试秀一下你处理内存泄露、调优和调试方面的牛逼技能。 我发现掌握这些技术的人都能给面试官留下深刻的印象。你们也可以到 how to fix java.lang.OutOfMemoryError去看看我写的另一篇关于这个问题更详细细节的文章

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

只有在try里面是有 System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。

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

这是一个经典的Java面试题了。我的一个朋友为Morgan Stanley招电信方面的核心Java开发人员的时候就问过这个问题。final和finally是Java的关键字,而finalize则是方法。 final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。而finalize()方法则是垃圾回收器在回收一个对象前调用,但也 Java规范里面没有保证这个方法一定会被调用。finally关键字是唯一一个和这篇文章讨论到的异常处理相关的关键字。在你的产品代码中,在关闭连接 和资源文件的是时候都必须要用到finally块。更多看here

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

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。

参考:

原文链接:http://javarevisited.blogspot.com/2013/06/10-java-exception-and-error-interview-questions-answers-programming.html

【Java基础】异常相关推荐

  1. Java基础-异常(Exception)处理

    Java基础-异常(Exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常的概述 什么是异常?Java代码在运行时期发生的问题就是异常.在Java中,把异 ...

  2. Java基础-异常-throws Exception-抛声明

    Java基础-异常-throws Exception-抛声明 参考文章: (1)Java基础-异常-throws Exception-抛声明 (2)https://www.cnblogs.com/pl ...

  3. JAVA基础——异常详解

    阅读目录 一.异常简介 二.try-catch-finally语句 三.throw和throws关键字 四.java中的异常链 五.结束语 JAVA异常与异常处理详解 回到顶部 一.异常简介 什么是异 ...

  4. Java基础—异常分类及处理

    目录 一.概念 三.异常的处理方式 四.throw 和 throws 的区别: 一.概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对 ...

  5. Java基础 — 异常

    异常对象都是派生于Throwable 类的一个实例. 异常层次结构简化示意图: 所有的异常都是由Throwable 继承而来,但在下一层立即分解为两个分支:Error 和 Exception Erro ...

  6. Java基础 —— 异常

    目录 异常的概念及分类 异常的处理try-catch-finally 异常抛出throw(s) 自定义异常 异常的概念及分类 什么是异常 异常是指在程序的运行过程中发生的一些不正常事件.比如:除0溢出 ...

  7. Java基础---异常---turow和throws

    异常 1.Throwable:可抛出的,是异常的顶层父类,其他的异常或者错误都是Throwable的子类类型,只有是Throwable的体系类型,才可以使用异常的处理机制 2.Error:错误,是Th ...

  8. 黑马程序员--java基础--异常(二)

    -------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iO ...

  9. Java基础-异常机制

    异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中 断正在运行的程序 所需文件找不到 网络连接不通或中断 算术运算错 (被零除-) 数组下标越界 装载一个不存在的 ...

  10. Java基础——异常

    异常(Exception) 基本概念 Java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误和逻辑错误不是异常) 执行过程中所发生的异常事件可分为两大类: ...

最新文章

  1. 斯坦福证明神经网络能直接在光学芯片上训练
  2. java中事务的介绍
  3. 学完了python能做什么-学会Python后都能做什么?网友们的回答简直不要太厉害
  4. Leetcode 187. 重复的DNA序列 解题思路及C++实现
  5. vue表单的基本使用
  6. 小米10pro使用说明书_华为Mate40、华为P40和小米10拍照对比:哪一款最好?
  7. 学习笔记-----fputs与printf
  8. SVN更新时报403错误
  9. opencv基于DNN的人脸检测
  10. php mktime 时间不对_PHP 语言需要避免的 10 大误区
  11. 通过options探测服务器信息,WEB服务器启用了OPTIONS方法
  12. [数分提高]2014-2015-2第1教学周第2次课
  13. 大学生计算机基础学多久,大学生计算机基础学期总结
  14. explain是mysql的关键字吗_mysql 中的explain关键字
  15. 【附源码】计算机毕业设计java医院人事及科室病区管理设计与实现
  16. 华为OD机试 - 日志首次上报最多积分
  17. [R语言]手把手教你如何绘图(万字)
  18. MATLAB基础学习(一)
  19. 2022生物降解塑料展|广州可降解塑料展
  20. 【详细图文教程】通过UNiDAYS进行Apple教育优惠认证

热门文章

  1. 记一次网易前端实习面试
  2. 百度推出飓风算法,严厉打击恶劣采集
  3. 内存的分配方式有几种? 动态内存的的传递注意事项!
  4. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(4)...
  5. PL/SQL Virtual Machine Memory Usage
  6. Redhat的硬盘安装
  7. [原创]某页网付费简历模板下载方法
  8. hud 5929.Basic Data Structure
  9. 【学习总结】之 3Blue1Brown系列
  10. maven 简易入门笔记