`
wanxiaotao12
  • 浏览: 473678 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]Java异常的分类-经常被架构师问的面试题

阅读更多
被架构师问的面试题
1. 异常机制
      异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
      传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。
异常处理的流程:
① 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象 。
② 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码 。

2 异常的分类
异常的分类:
① 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
② Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。

每个类型的异常的特点
Error体系 :
      Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。

Exception体系包括RuntimeException体系和其他非RuntimeException的体系 :
① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。


与C++异常分类的不同 :
① Java中RuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的。(在编译时出现的错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误)。
② C++中logic_error与Java中的RuntimeException是等价的,而runtime_error与Java中非RuntimeException类型的异常是等价的。



3 异常的使用方法
声明方法抛出异常
① 语法:throws(略)
② 为什么要声明方法抛出异常?
      方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
③ 为什么抛出的异常一定是已检查异常?
      RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常。遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。
      注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。

如何抛出异常
① 语法:throw(略)
② 抛出什么异常?对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是ClassCastException,那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名能够明确说明异常情况的类。
③ 异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。
④ 创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。需要注意的是,唯一有用的就是类型名这个信息,所以不要在异常类的设计上花费精力。

捕获异常
      如果一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;对于一个图形界面程序,也会输出异常的信息,但是程序并不中止,而是返回用错误页面。
      语法:try、catch和finally(略),控制器模块必须紧接在try块后面。若掷出一个异常,异常控制机制会搜寻参数与异常类型相符的第一个控制器随后它会进入那个catch 从句,并认为异常已得到控制。一旦catch 从句结束对控制器的搜索也会停止。
      捕获多个异常(注意语法与捕获的顺序)(略)
      finally的用法与异常处理流程(略)
      异常处理做什么?对于Java来说,由于有了垃圾收集,所以异常处理并不需要回收内存。但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源。
      应该声明方法抛出异常还是在方法中捕获异常?原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常。
再次抛出异常
①为什么要再次抛出异常? 在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。
②异常处理流程 :对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级。



4 关于异常的其他问题
① 过度使用异常 :首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
② 将异常与普通错误区分开:对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
③ 异常对象中包含的信息 :一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ilibaba/archive/2009/03/07/3965359.aspx
分享到:
评论

相关推荐

    【Java面试资料】-1000道 互联网Java架构师面试题 面试必备神器

    这份名为“【Java面试资料】-1000道 互联网Java架构师面试题 面试必备神器”的压缩包,显然是一份针对Java架构师面试的全面学习资源。其中包含的PDF文档很可能是精心整理的面试问题集,旨在帮助准备Java架构师职位...

    BAT大厂2023年Java架构师岗面试题(综合版)

    Java 架构师在面试过程中会面临一系列深入且全面的问题,涵盖从基础知识到高级概念的广泛领域。以下是一些基于给定标题和描述的关键知识点详解: 1. **Java 语言特点**: - **简单易学**:Java 语法简洁,易于理解...

    1000+ 互联网Java架构师面试题

    【互联网Java架构师面试题】涉及的范围广泛,主要涵盖了Java基础、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL数据库、Spring框架全家桶(包括Spring、Spring Boot和Spring Cloud)、消息...

    java架构师面试题1000道

    Java架构师面试题1000道集合涵盖了广泛的话题,旨在测试和提升候选人在Java编程、软件设计、系统架构、性能优化以及项目管理等多个领域的专业技能。以下是一些可能涉及的关键知识点: 1. **Java基础知识**:这包括...

    架构师之JAVA面试攻略.zip

    "应聘Java笔试时可能出现问题及其答案 (1).doc"和"面试题整理.pdf"则提供了实际面试中的常见问题和解答示例,你可以通过这些资料来检查自己的知识掌握程度,找出不足,针对性地进行复习。 总的来说,成为一名优秀的...

    2019最新一线互联网大厂java面试题及答案(适合面试前冲刺刷题)

    2019年的Java面试题集锦,不仅包含了基础理论的深度挖掘,还融入了当时业界流行的架构技术、Spring框架、微服务架构以及JVM优化等关键知识点。这份资料旨在帮助求职者在面试前进行高效地冲刺刷题,提升技术实力,...

    Java面试题资源合集

    土豪可直接下载,建议搜索微信公众号【致架构师】,回复面试题,可免费下载Java面试题资源合集,涵盖Java各项核心技术面试资料,包括BIO,NIO,AIO,Netty,Dubbo,ElasticSearch,Git,Java虚拟机(JVM),异常,...

    JAVA架构师知识整理)

    JAVA 架构师知识点总结 本文档旨在为Java架构师提供一个详细的知识点总结,涵盖了Java架构师所需的知识点,从机器学习到数据库设计、JVM等多个方面。 一、机器学习 机器学习是人工智能的一个子领域,关注于开发...

    架构师进阶之路-Java架构致力于提供后端工程师提供架构设计相关的各种资源和面试题 .zip

    在“架构师进阶之路-Java架构”这个资源包中,我们主要关注的是Java后端开发人员如何逐步提升自己的技术水平,成为一个优秀的架构师。这个压缩包包含了一个名为"JavaArchitecture-master"的项目,这通常意味着这是一...

    1000道 互联网大厂Java工程师面试题.zip

    "1000道互联网大厂Java工程师面试题.zip"这个压缩包很可能包含了一份详尽的面试准备资料,其中"1000道互联网大厂Java工程师面试题.pdf"很可能是这份资料的电子版。 首先,让我们从Java语言基础出发。Java是面向对象...

    1000道 互联网Java工程师面试题 (666).7z

    标题 "1000道 互联网Java工程师面试题 (666).7z" 暗示了这是一份专为互联网Java工程师准备的面试题集合,其中包含了丰富的技术问题,旨在测试候选人的专业技能和知识深度。描述中的重复内容进一步强调了这份资源的...

    Java学习、面试必备

    - 定期刷面试题,巩固知识并了解最新技术动态。 - 参与开源项目或实际项目,将理论知识转化为实践经验。 总之,"新手必看"这个压缩包为Java初学者提供了一个全面的学习和面试指南,涵盖了从基础到进阶的各个层面...

    excel技术,Java架构师面试资料

    这份"excel技术,Java架构师面试资料"包含了一些关键知识点,对于准备面试或是提升技能的专业人士非常有帮助。以下是对这些主题的详细说明: 1. **Excel技术**:Excel不仅仅是办公室里的数据处理工具,它在IT领域也...

    架构师面试题参考 (2).docx

    以下是一些针对架构师的面试题及其涉及的知识点: 1. **Struts、Spring、Hibernate 开源框架的历史局限性与适用场景**: - Struts 是基于MVC设计模式的Web框架,但在处理复杂的交互和现代前端技术(如AJAX、Flash...

    JAVA后端架构师成长路线图-2023版.pdf

    JAVA后端架构师成长路线图-2023版 本资源是一个全面、系统的JAVA后端架构师成长路线图,旨在帮助Java程序员快速成为架构师。该资源通过访谈数十位一线大厂架构师,了解他们的成长历程,了解最新的企业技术,抽象出...

    Java工程师必备面试题【多线程、反射、类加载器、JVM、泛型、异常处理、注解、面向对象编程、集合、IO流、序列化】

    适用人群:以上Java面试题适用于准备Java开发工程师、Java后端开发工程师、Java架构师等职位面试的求职者。 使用场景及目标:以上Java面试题可以作为面试前的复习和准备材料,帮助求职者复习Java基础知识,加深对...

    架构师面试题参考.docx

    【架构师面试题参考】 1. **Struts, Spring, Hibernate 开源框架的历史局限性与适用场景** Struts 是基于请求驱动的框架,在富客户端(如 AJAX 和 Flash)日益普及的情况下,它显得较为落后,因为无法很好地处理...

    java高级工程师、技术专家、架构师等职位面试题.zip

    【一线互联网大厂Java核心面试题库】Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等..

Global site tag (gtag.js) - Google Analytics