Java异常:选择Checked Exception还是Unchecked Exception
- 格式:pdf
- 大小:414.78 KB
- 文档页数:9
Java异常(Exception)处理以及常见异常总结⽬录前⾔异常简介异常类型总结前⾔很多事件并⾮总是按照⼈们⾃⼰设计意愿顺利发展的,经常出现这样那样的异常情况。
例如:你计划周末郊游,计划从家⾥出发→到达⽬的→游泳→烧烤→回家。
但天有不测风云,当你准备烧烤时候突然天降⼤⾬,只能终⽌郊游提前回家。
“天降⼤⾬”是⼀种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。
计算机程序的编写也需要考虑处理这些异常情况。
异常(exception)是在运⾏程序时产⽣的⼀种异常情况,已经成为了衡量⼀门语⾔是否成熟的标准之⼀。
⽬前的主流编程语⾔java也提供了异常处理机制。
异常简介Java中的异常⼜称为例外,是⼀个在程序执⾏期间发⽣的事件,它中断正在执⾏程序的正常指令流。
为了能够及时有效地处理程序中的运⾏错误,必须使⽤异常类,这可以让程序具有极好的容错性且更加健壮。
在 Java 中⼀个异常的产⽣,主要有如下三种原因:1. Java 内部错误发⽣异常,Java 虚拟机产⽣的异常。
2. 编写的程序代码中的错误所产⽣的异常,例如空指针异常、数组越界异常等。
3. 通过 throw 语句⼿动⽣成的异常,⼀般⽤来告知该⽅法的调⽤者⼀些必要信息。
Java 通过⾯向对象的⽅法来处理异常。
在⼀个⽅法的运⾏过程中,如果发⽣了异常,则这个⽅法会产⽣代表该异常的⼀个对象,并把它交给运⾏时的系统,运⾏时系统寻找相应的代码来处理这⼀异常。
我们把⽣成异常对象,并把它提交给运⾏时系统的过程称为拋出(throw)异常。
运⾏时系统在⽅法的调⽤栈中查找,直到找到能够处理该类型异常的对象,这⼀个过程称为捕获(catch)异常。
例 1为了更好地理解什么是异常,下⾯来看⼀段⾮常简单的 Java 程序。
下⾯的⽰例代码实现了允许⽤户输⼊ 1~3 以内的整数,其他情况提⽰输⼊错误。
package io.renren.config;import java.util.Scanner;/*** Created by LiYangYong*/public class TestException {public static void main(String[] args) {System.out.println("请输⼊您的选择:(1~3 之间的整数)");Scanner input = new Scanner(System.in);int num = input.nextInt();switch (num) {case 1:System.out.println("one");break;case 2:System.out.println("two");break;case 3:System.out.println("three");break;default:System.out.println("error");break;}}}正常情况下,⽤户会按照系统的提⽰输⼊ 1~3 之间的数字。
2025年招聘Java开发工程师面试题与参考回答面试问答题(总共10个问题)第一题:请描述一下Java中的反射机制及其在Java编程中的应用场景。
答案:Java的反射机制是指在运行时,程序能够取得任何类或对象的内部信息,并且动态创建对象、调用对象的方法以及获取对象的属性。
以下是反射机制的一些关键点:1.反射机制允许在运行时动态地加载和调用类的方法。
2.反射机制可以获取类的构造方法、字段、方法和注解等信息。
3.反射机制提供了访问和修改类内部状态的能力。
应用场景:1.创建对象:通过反射机制,可以在运行时创建任意类的实例。
2.方法调用:在运行时动态调用任意对象的方法。
3.获取类信息:在运行时获取类的名称、父类、接口等信息。
4.动态代理:在实现动态代理时,通过反射机制动态创建代理对象。
5.脚本语言集成:某些脚本语言可以通过反射机制与Java代码进行交互。
解析:反射机制在Java编程中具有广泛的应用,以下是几个具体的例子:•在框架开发中,如Spring框架,反射机制被用来动态地注册和管理Bean。
•在插件系统中,反射机制允许在运行时动态加载和调用插件。
•在测试框架中,如JUnit,反射机制被用来动态调用测试方法。
•在JDBC编程中,反射机制可以用来动态创建数据库连接和执行SQL语句。
反射机制虽然功能强大,但也存在一些缺点,如性能开销大、代码难以理解等。
因此,在使用反射时,应尽量减少不必要的反射操作。
第二题:请简述Java中的多态性及其实现方式,并举例说明在Java中如何通过多态来简化代码设计。
答案:多态性是面向对象编程中的一个核心概念,它允许同一个接口或父类在不同的情况下表现出不同的行为。
在Java中,多态性主要通过继承和接口实现。
1.继承:当一个子类继承了父类后,子类对象可以调用父类的方法和属性,如果子类对父类的方法进行了重写(即子类提供了与父类方法相同签名但不同实现的方法),那么在调用该方法时,就会根据对象的实际类型来执行对应的方法。
java开发工程师面试题一、基础知识部分1. Java的特点及优势Java是一种面向对象的编程语言,具有跨平台、安全可靠、功能强大等优势。
其特点包括:- 简单易学:Java语法类似于C++,减少了开发者的学习成本。
- 面向对象:Java支持封装、继承和多态等面向对象的特性,使得代码更易于管理和维护。
- 跨平台性:通过Java虚拟机(JVM)实现,一次编写,到处运行,无需为具体平台编写不同的代码。
- 高性能:Java通过即时编译器优化字节码,提供了高效的执行性能。
- 安全性:Java提供了安全管理机制和垃圾回收机制,减少了内存泄漏和代码安全问题。
- 多线程:Java内置多线程支持,方便开发者编写多线程程序。
2. Java中的基本数据类型有哪些?Java的基本数据类型包括:byte、short、int、long、float、double、boolean和char。
3. 什么是Java中的自动装箱和拆箱?自动装箱(Autoboxing)是指将基本数据类型自动转换为对应的封装类型,而拆箱(Unboxing)则是相反的过程,将封装类型自动转换为对应的基本数据类型。
4. 什么是Java中的重载和重写?重载(Overload)是指在同一个类中,可以定义多个方法名相同但参数列表不同的方法。
重载的方法可以有不同的返回类型,但不能仅通过返回类型的不同来区分。
重写(Override)是指子类对父类中已有方法进行重新定义。
重写要求方法名、参数列表和返回类型都相同,可以重新定义方法体,但不能改变方法的基本行为。
5. Java中的final关键字有什么作用?final关键字可以用于修饰类、方法和变量。
- 修饰类:被final修饰的类无法被继承。
- 修饰方法:被final修饰的方法无法在子类中被重写。
- 修饰变量:被final修饰的变量为常量,只能被赋值一次,值不能被修改。
二、面向对象编程部分1. 什么是面向对象编程(OOP)?面向对象编程是一种编程范式,通过将数据和操作数据的方法封装在一起,以对象的方式来组织代码。
java异常处理方法及流程Java 异常处理方法及在 Java 编程中,异常处理是一项非常重要的技术。
通过适当的异常处理方法,可以使程序具备更好的稳定性和可读性,提高程序的健壮性。
本文将详细介绍 Java 异常处理的各个流程。
异常的基本概念异常是在程序执行期间产生的一种错误或异常情况。
Java 引入了异常处理机制来处理这些异常,以提高程序的可靠性和可维护性。
异常分为两种类型:1.受检异常(Checked Exceptions):受检异常在编译阶段必须进行处理,否则编译器将报错。
例如,IOException 是常见的受检异常。
2.非受检异常(Unchecked Exceptions):非受检异常是指不需要显式捕获或声明抛出的异常,编译器不会检查是否对其进行处理。
例如,NullPointerException 是常见的非受检异常。
异常处理的方法Java 提供了多种处理异常的方法,包括捕获异常和抛出异常。
下面分别进行介绍。
捕获异常是指通过使用try-catch语句块来捕获并处理异常。
try语句块用于包裹可能出现异常的代码,catch语句块用于捕获并处理异常。
try {// 可能抛出异常的代码块// ...} catch (ExceptionType1 e1) {// 处理异常类型1// ...} catch (ExceptionType2 e2) {// 处理异常类型2// ...} finally {// 可选的 finally 代码块,始终会被执行// ...}抛出异常当一个方法无法处理某个异常时,可以通过throw关键字手动抛出异常。
异常将会被传递给调用该方法的代码,并进一步处理。
public void someMethod() throws SomeException {if (someCondition) {throw new SomeException("Some error message");}使用异常的注意事项在使用异常处理时,需要注意以下几点:•捕获异常的顺序非常重要,应该从特定异常到一般异常的顺序进行捕获。
java高级面试题及答案一、基础理论知识1. 请解释Java中的四种访问修饰符及其作用范围。
答:Java中的四种访问修饰符分别是public、protected、default(无修饰符)和private。
public修饰的类或成员可以被任何其他类访问;protected修饰的成员可以被同一个包内的类以及子类访问;default(无修饰符)的成员只能被同一个包内的类访问;private修饰的成员只能在声明它的类内部访问。
2. 什么是Java的序列化和反序列化?请举例说明。
答:Java序列化是将对象的状态信息转换为字节流的过程,以便于存储或传输。
反序列化则是将字节流恢复为原来的对象。
例如,通过ObjectOutputStream和ObjectInputStream类可以实现对象的序列化和反序列化。
3. 解释Java中的多态性及其优势。
答:多态性是指允许使用子类对象来替代父类对象的能力。
在Java中,这是通过继承和接口实现的。
多态性的优势包括代码的可扩展性和可维护性,以及能够编写更通用的代码。
二、Java集合框架1. 请比较ArrayList和LinkedList的性能差异。
答:ArrayList是基于动态数组的数据结构,适合随机访问;LinkedList是基于双向链表的数据结构,适合频繁的插入和删除操作。
在随机访问大量元素时,ArrayList的性能优于LinkedList;而在插入和删除操作频繁时,LinkedList的性能更优。
2. 什么是HashMap的工作原理,以及如何解决它的线程安全问题?答:HashMap基于哈希表实现,通过键的哈希值来计算存储位置。
当两个不同的键具有相同的哈希值时,会发生哈希冲突,HashMap通过链表或红黑树来解决这个问题。
对于线程安全问题,可以使用ConcurrentHashMap,它通过锁分离技术来提供线程安全的映射。
三、异常处理1. 请解释Java中的异常处理机制。
运⾏时异常⾮运⾏异常和检查异常⾮检查异常可以看出异常的家族势⼒庞⼤,通常我们说的异常是包括exceptio和error。
Exception家族我们恐怕见的不少,但是error家族我们可能就没什么印象了,下⾯我来说说这两个类的区别:Error(错误):是程序⽆法处理的错误,表⽰运⾏应⽤程序中较严重问题。
⼤多数的错误与代码编写者执⾏的操作⽆关,⽽是表⽰代码运⾏时 JVM(Java 虚拟机)出现的问题。
例如,Java虚拟机运⾏错误(Virtual MachineError),当 JVM 不再有继续执⾏操作所需的内存资源时,将出现 OutOfMemoryError。
这些异常发⽣时,Java虚拟机(JVM)⼀般会选择线程终⽌。
这些错误表⽰故障发⽣于虚拟机⾃⾝、或者发⽣在虚拟机试图执⾏应⽤时,如Java虚拟机运⾏错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。
这些错误是不可查的,因为它们在应⽤程序的控制和处理能⼒之外,⽽且绝⼤多数是程序运⾏时不允许出现的状况。
对于设计合理的应⽤程序来说,即使确实发⽣了错误,本质上也不应该试图去处理它所引起的异常状况。
在 Java中,错误通过Error的⼦类描述。
个⼈理解:出现Error错误⼀般不是由于你编写的代码出现问题,⽽是由于JVM运⾏你这段代码出现了问题,⽐如堆溢出,配置⽂件出错等,这些你是⽆法⼈为的在你代码⾥可以保证的,必须要额外的去操作,重新配置虚拟机,修改配置⽂件等等。
Exception(异常):是程序本⾝可以处理的异常。
也就是你常见的空指针异常(NullPointerException),数组超出范围异常(IndexOutOfBoundsException)等等。
通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和⾮检查的异常(unchecked exceptions)。
代码中如何进行异常处理异常处理是一种预防程序崩溃的重要技术。
在编写程序时,可能会遇到各种状况,比如程序遇到无法处理的数据、无法打开文件、网络连接失败等等问题。
这些状况都可以被称为异常。
当程序在运行过程中遇到异常时,如果没有进行有效的处理,程序就可能会崩溃或表现出不可预料的行为。
而如果程序能够针对异常进行有效的处理,就可以保证程序的稳定性和可靠性。
本文将讨论代码中如何进行异常处理,以及异常处理的最佳实践。
一、异常的分类在开始讨论异常处理之前,需要了解异常的分类。
根据其来源以及对程序的影响,异常可以分为两种类型:一种是受检异常(Checked Exception),另一种是非受检异常(Unchecked Exception)。
1.受检异常受检异常通常是由外部因素引起的问题,如网络连接错误、IO操作错误等。
这些异常是在编译期间就已经被发现的,编译器要求开发人员必须要明确地捕获这些异常并进行处理。
否则编译器就会报错,强制要求开发人员对异常进行处理。
在Java中,受检异常都要继承自Exception类或者其子类。
比如IOException、SQLException等,这些都是受检异常的典型代表。
在使用受检异常时,开发人员必须要用try-catch语句块来捕获这些异常,并对它们进行处理。
因为受检异常已经在编译期就被确定了,所以Java编译器要求开发人员必须要进行异常处理,否则就会编译错误。
2.非受检异常非受检异常也称程序异常(Program Exception),通常是由代码中的错误导致的问题。
比如数组下标越界、类型转换错误等。
这些异常都是在运行期间才会发现的,而且程序在遇到这些异常时通常都会崩溃。
与受检异常不同的是,非受检异常不会被Java编译器要求进行处理。
开发人员可以选择捕获这些异常,也可以选择不处理。
Java中非受检异常通常要继承自RuntimeException类或其子类。
比如NullPointerException、IndexOutOfBoundsException等,这些都是非受检异常的典型代表。
浅析Java异常处理机制及应用摘要:Java异常处理机制是Java编程语言中最为重要的机制之一,它可以在代码中处理各种类型的异常。
本文将对Java异常处理机制进行浅析,并从应用层面探讨一些常见的Java异常处理方法。
关键词:Java,异常处理,应用正文:一、Java异常处理机制Java异常处理机制是Java编程语言中最为重要的机制之一。
在Java语言中,异常是指一个程序运行时产生的意外情况,可以是代码中的错误,也可以是由于外部环境因素导致的错误。
Java提供了一整套异常处理机制,可以帮助开发者处理各种类型的异常。
在Java中,异常通常被定义为继承自Throwable类的任意一个子类。
常见的异常类型包括RuntimeException、IOException、ClassNotFoundException、ArithmeticException等等。
Java中异常的处理主要分为两种方式:try-catch块和throws语句。
try-catch块是一种捕捉异常的方法,其基本语法结构如下:```try {// 可能会抛出异常的代码块} catch (type1 e1) {// 处理type1类型异常的代码块} catch (type2 e2) {// 处理type2类型异常的代码块} finally {// 不管是否发生异常,都会执行的代码块}```throws语句是一种抛出异常的方法,其基本语法结构如下:```public void methodName() throws ExceptionType {// 可能会抛出异常的代码块}```二、Java异常处理的应用Java异常处理机制应用广泛,以下是应用层面探讨一些常见的Java异常处理方法。
1、基于try-catch块的异常处理try-catch块是Java中最基本的异常处理方法。
它可以在程序运行时捕捉异常,并且根据不同的异常类型采取不同的处理方法。
Java是一种面向对象的编程语言,所以在编写Java程序时需要考虑异常处理。
异常是指在程序运行过程中出现的错误、故障或意外情况,而异常处理机制则是为了保证程序在遇到异常时能够正确、有效地进行处理,确保程序的稳定性和安全性。
1. 异常的分类在Java中,异常分为受检异常(Checked Exception)和非受检异常(Unchecked Exception)。
受检异常是指在编译期就能够被检测到的异常,需要进行显式的处理;非受检异常则是指在运行期才能被检测到的异常,通常是由程序错误造成的,需要进行相应的处理。
2. 异常处理机制的流程在Java中,异常处理机制主要涉及到try、catch、finally和throw关键字的使用。
(1) try块:在try块中编写可能会引发异常的代码。
如果在try块中出现了异常,程序会立即跳转到catch块进行相应的异常处理。
(2) catch块:在catch块中定义对异常的处理逻辑。
在catch块中可以针对不同类型的异常编写不同的处理代码,也可以进行异常的记录、打印或其他操作。
(3) finally块:finally块中的代码无论是否出现异常都会被执行。
通常在finally块中释放资源、关闭文件等清理工作。
(4) throw关键字:throw关键字用于手动抛出一个异常。
当程序中的某个条件不满足时,可以使用throw关键字抛出一个异常,然后交由catch块进行处理。
3. 异常处理机制的应用在实际的Java编程中,异常处理机制是非常重要的。
通过合理地编写异常处理代码,可以提高程序的容错性和稳定性,保证程序在面对异常时能够优雅地处理并继续执行。
另外,Java中还提供了一些与异常相关的类,例如Throwable、Exception和RuntimeException等,开发人员可以根据实际需求选择合适的异常类来进行处理。
异常处理机制是Java程序设计中不可或缺的重要部分,合理并且规范地使用异常处理机制能够提高程序的可靠性和稳定性,也能让程序更加健壮。
常见的⼏种异常类型Exception 常见异常类型:Java中的异常分为两⼤类:1.Checked Exception(⾮Runtime Exception) 2.Unchecked Exception(Runtime Exception)算数异常类:ArithmeticExecption空指针异常类型:NullPointerException类型强制转换类型:ClassCastException数组负下标异常:NegativeArrayException数组下标越界异常:ArrayIndexOutOfBoundsException违背安全原则异常:SecturityException⽂件已结束异常:EOFException⽂件未找到异常:FileNotFoundException字符串转换为数字异常:NumberFormatException操作数据库异常:SQLException输⼊输出异常:IOException⽅法未找到异常:NoSuchMethodException下标越界异常:IndexOutOfBoundsExecption系统异常:SystemException创建⼀个⼤⼩为负数的数组错误异常:NegativeArraySizeException数据格式异常:NumberFormatException安全异常:SecurityException不⽀持的操作异常:UnsupportedOperationException⽹络操作在主线程异常:NetworkOnMainThreadException请求状态异常: IllegalStateException (extends RuntimeException ,⽗类:IllegalComponentStateException在不合理或不正确时间内唤醒⼀⽅法时出现的异常信息。
换句话说,即 Java 环境或 Java 应⽤不满⾜请求操作)⽹络请求异常:HttpHostConnectException⼦线程Thread更新UI view 异常:ViewRootImpl$CalledFromWrongThreadException证书不匹配的主机名异常: SSLExceptionero反射Method.invoke(obj, args...)⽅法抛出异常:InvocationTargetExceptionEventBus使⽤异常:EventBusException⾮法参数异常:IllegalArgumentException参数不能⼩于0异常:ZeroException。
选择Checked Exception还是Unchecked Exception?By Jakob JenkovJava包含两种异常:checked异常和unchecked异常。
C#只有unchecked异常。
checked和unchecked异常之间的区别是:1. Checked异常必须被显式地捕获或者传递,如Basic try-catch-finally Exception Handling一文中所说。
而unchecked异常则可以不必捕获或抛出。
2. Checked异常继承ng.Exception类。
Unchecked异常继承自ng.RuntimeException类。
有许多支持或者反对二者甚至是否应该使用checked异常的争论。
本文将讨论一些常见的观点。
开始之前,先澄清一个问题:Checked和unchecked异常从功能的角度来讲是等价的。
可以用checked异常实现的功能必然也可以用unchecked异常实现,反之亦然。
选择checked异常还是unchecked异常是个人习惯或者组织规定问题。
并不存在谁比谁强大的问题。
一个简单的例子在讨论checked和unchecked异常的优缺点前先看一下代码中如下使用它们。
下面是一个抛出checked异常的方法,另一个方法调用了它:[java]view plaincopyprint?1.public void storeDataFromUrl(String url){2. try {3. String data = readDataFromUrl(url);4. } catch (BadUrlException e) {5. e.printStackTrace();6. }7.}8.9.public String readDataFromUrl(String url)10.throws BadUrlException{11. if(isUrlBad(url)){12. throw new BadUrlException("Bad URL: " + url);13. }14.15. String data = null;16. //read lots of data over HTTP and return17. //it as a String instance.18.19. return data;20.}readDataFromUrl()方法抛出了BadUrlException。
BadUrlException是我自己实现的一个类。
由于BadUrlException继承自ng.Exception,因而它是checked异常:[java]view plaincopyprint?1.public class BadUrlException extends Exception {2. public BadUrlException(String s) {3. super(s);4. }5.}如果storeDataFromUrl()方法想要调用readDataFromUrl(),它只有两种选择。
要么捕获BadUrlException,要么沿着调用栈继续向上传播该异常。
上面的代码中storeDataFromUrl() 捕获了异常。
向上传播异常的实现方法如下:[java]view plaincopyprint?1.public void storeDataFromUrl(String url)2.throws BadUrlException{3. String data = readDataFromUrl(url);4.}可以看到,上述代码去掉了catch块,方法声明中加上了throws BadUrlException。
下面,讨论一下unchecked异常的实现方法。
首先,将BadUrlException改为继承自ng.RuntimeException:[java]view plaincopyprint?1.public class BadUrlException extends RuntimeException {2. public BadUrlException(String s) {3. super(s);4. }5.}然后,把方法中的异常改为unchecked BadUrlException:[java]view plaincopyprint?1.public void storeDataFromUrl(String url){2. String data = readDataFromUrl(url);3.}4.5.public String readDataFromUrl(String url) {6. if(isUrlBad(url)){7. throw new BadUrlException("Bad URL: " + url);8. }9.10. String data = null;11. //read lots of data over HTTP and12. //return it as a String instance.13.14. return data;15.}注意,readDataFromUrl()方法不再声明抛出BadUrlException。
storeDataFromUrl()方法也不必捕获BadUrlException。
storeDataFromUrl()也可以捕获异常,但不再是必须的了,而且它也不必声明传播异常。
Checked 还是Unchecked?上一节我们已经讨论了checked异常和unchecked异常代码实现上的区别,下面深入分析二者的适用情况(支持和反对二者的观点)。
一些Java书籍(如Suns Java Tutorial)中建议在遇到可恢复的错误时采用checked异常,遇到不可恢复的异常时采用unchecked异常。
事实上,大多数应用必须从几乎所有异常(包括NullPointerException,IllegalArgumentException和许多其他unchecked异常)中恢复。
执行失败的action/transaction会被取消,但是应用程序必须能继续处理后续的action 或transaction。
关闭一个应用的唯一合法时机是应用程序启动时。
例如,如果配置文件丢失而且应用程序依赖于它,那么这时关闭应用程序是合法的。
我建议的使用策略是:选择checked异常或unchecked异常中的一种使用。
混合使用经常导致混乱和不一致。
如果你是一个经验丰富的程序员,那么根据自己的需要使用吧。
下面是支持和反对checked/unchecked异常的一些最常见的观点。
支持一种类型的exception的观点通常意味着反对另一种(支持checked = 反对unchecked,支持unchecked = 反对checked)。
因此,只列出了支持checked异常或unchecked异常的列表。
1. 支持Checked异常:编译器强制检查,checked异常必须被捕获或者传播,这样就不会忘记处理异常。
2. 支持Checked异常:Unchecked异常容易忘记处理,由于编译器不强制程序员捕获或传播它(第一条的反面表述)。
3. 支持Unchecked异常:沿调用栈向上传播的Checked异常破坏了顶层的方法,因为这些方法必须声明抛出所有它们调用的方法抛出的异常。
4. 支持Checked异常:当方法不声明它们会抛出何种异常时,就难以处理它们抛出的异常。
5. 支持Unchecked异常:Check异常的抛出作为方法接口的一部分,这使得添加或移除早期版本中方法的异常难以实现。
上述每一个观点都有相反的观点,下面我会详细讨论这些观点。
观点1(支持Checked异常):编译器强制检查,checked异常必须被捕获或者传播,这样就不会忘记处理异常。
相反观点:当被强制捕获或传播许多异常时,开发人员的效率会受到影响,也可能会只写[java]view plaincopyprint?1.try{2. callMethodThatThrowsException();3.catch(Exception e){4.}来忽略错误(糊弄了事)。
观点2(支持Checked异常):Unchecked异常容易忘记处理,由于编译器不强制程序员捕获或传播它(第一条的反面表述)。
相反观点1:强制处理或传播checked异常导致的草率地异常处理非常糟糕。
相反观点2:在近期的一个大型项目中我们决定采用unchecked异常。
我在这个项目中获得的经验是:使用unchecked异常时,任何方法都可能抛出异常。
因此我不论在写哪一部分代码都时刻注意异常。
而不只是声明了checked异常的地方。
此外,许多没有声明任何checked异常的标准的Java API方法会抛出诸如NullPointerException或者InvalidArgumentException之类的unchecked异常。
你的应用程序需要处理这些unchecked异常。
你可能会说checked 异常的存在让我们容易忘记处理unchecked异常,因为unchecked异常没有显式地声明。
观点3(支持Unchecked异常):沿调用栈向上传播的Checked异常破坏了顶层的方法,因为这些方法必须声明抛出所有它们调用的方法抛出的异常。
即,声明的异常聚合了调用栈中所有的方法抛出的异常。
例如:[java]view plaincopyprint?1.public long readNumberFromUrl(String url)2.throws BadUrlExceptions, BadNumberException{3. String data = readDataFromUrl(url);4. long number = convertData(data);5. return number;6.}7.8.private String readDataFromUrl(String url)9.throws BadUrlException {10. //throw BadUrlException if url is bad.11. //read data and return it.12.}13.14.private long convertData(String data)15.throws BadNumberException{16. //convert data to long.17. //throw BadNumberException if number isn't within valid range.18.}readNumberFromUrl()必须声明抛出BadUrlException和BadNumberException,而这两个异常是readNumberFromUrl()调用的readDataFromUrl() 和 converData()方法抛出的异常。