在 可能会出现exception的地方,要使用try-catch或者throws或者两者都要。我的判断依据是:如果对可能出现的exception不想 被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直 接抛出或者抛出自定义的exception。
一、异常的种类
Java中异常的分类
所有异常,都继承自java.lang.Throwable类。
Throwable有两个直接子类,Error类和Exception类。
Exception
Exception则可使从任何标准Java库的类方法,自己的方法以及运行时任何异常中抛出来的基类型。
异常可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种
RuntimeException
RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部分RuntimeException。
RuntimeException
是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException
的任何子类都无需在throws
子句中进行声明。(java api)
它是uncheckedExcepiton。
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.EnumConstantNotPresentException
Java.lang.IllegalArgumentException
Java.lang.IllegalThreadStateException
Java.lang.NumberFormatException
Java.lang.IllegalMonitorStateException
Java.lang.IllegalStateException
Java.lang.IndexOutOfBoundsException
Java.lang.ArrayIndexOutOfBoundsException
Java.lang.StringIndexOutOfBoundsException
Java.lang.NegativeArraySizeException’
Java.lang.NullPointerException
Java.lang.SecurityException
Java.lang.TypeNotPresentException
Java.lang.UnsupprotedOperationException
CheckedException
除了runtimeException以外的异常,都属于checkedException,它们都在java.lang库内部定义。Java编译器要求程序必须捕获或声明抛出这种异常。
一个方法必须通过throws语句在方法的声明部分说明它可能抛出但并未捕获的所有checkedException。
Java.lang.ClassNotFoundException
Java.lang.CloneNotSupportedException
Java.lang.IllegalAccessException
Java.lang.InterruptedException
Java.lang.NoSuchFieldException
Java.lang.NoSuchMetodException
Error
当程序发生不可控这种错误时,通常的做法是通知用户并中止程序的执行。
与异常不同的是Error及其子类的对象不应被抛出。
Error 是 Throwable 的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。
它是uncheckedExcepiton。
还可参考链接:http://blog.csdn.net/ilibaba/article/details/3965359
二、主要原则
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。
一般来说,GUI端是要处理异常的,比如JSP捕获到异常之后,需要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。
换句话说,所有的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,比如在服务器端运行的JavaBean是否要处理捕获到的异常,还是继续抛出所捕获的异常,需要视具体情况处理。
除非你想把异常处理的责任交给调用者,一般不用throws。 比如你要读入一些文件,如果你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;如果你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。
这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。
需要注意的有:
1、如果无法处理某个异常,那就不要捕获它。
2、如果捕获了一个异常,请不要胡乱处理它。
3、尽量在靠近异常被抛出的地方捕获异常。
4、在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。
5、按照您的异常处理必须多精细来构造您的方法。
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常。
三、异常嵌套和捕获适当的异常
按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。
异常嵌套
你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?
要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。
此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。
捕获适当的异常
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。
规则 #1: 总是捕获扔出异常的类型而不要理睬异常的超类。 为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(SQLException sqle)
规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,如果采用了日志API(Logging API),那么请编写代码把异常写到日志中。
规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。
扔 出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,所有的问题都会强加在API用户的头上,这样他们就无法以一种 专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。
以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕获适当的异常令程序调试大大简化。
相关推荐
"异常捕获与抛出的问题,什么时候应该try,什么时候应该throws" 在 Java 中,捕获异常和抛出异常是两种不同的机制,分别用于处理不同的异常场景。 捕获异常(try-catch) 捕获异常是指在方法内部使用 try-catch ...
总之,有效处理Java异常的三个原则——具体明确异常、提早抛出异常和延迟捕获异常,对于创建健壮、易于调试的Java应用程序至关重要。通过合理使用异常类型、异常堆栈跟踪以及用户友好的错误处理提示,我们能够构建出...
try 语句块,表示要尝试运行代码,try 语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。 catch 语句块会捕获 try 代码块中发生的异常并在其代码块中做异常处理,catch 语句带一个 Throwable 类型的...
Java 异常处理的一般原则是:尽量少地抛出异常,尽量多地捕获异常。抛出异常时,应该提供详细的错误信息,以便于调试和维护。捕获异常时,应该对异常进行合理的处理,以便于恢复程序的正常执行。 Java 异常处理框架...
8. **异常匹配原则**:捕获的异常应与抛出的异常完全匹配或为抛出异常的父类。否则,可能会导致意外的处理逻辑。 9. **返回值可能为null的注释**:允许方法返回null,但需在注释中明确指出可能返回null的情况,提醒...
Java异常处理机制研究的知识点涵盖了异常处理的基本概念、分类、原则以及实际应用等方面。 1. 异常处理概念 异常处理是Java语言中用于处理程序运行时遇到的错误和异常情况的一种机制。它通过异常类的层次结构来实现...
`try`块包含可能会抛出异常的代码,`catch`块用于捕获并处理异常,`finally`块则确保无论是否发生异常都会执行的代码,通常用于资源清理。 4. **自定义异常** 当标准的异常类不满足需求时,可以创建新的异常类,...
本文将从 Java 异常处理机制的原理、分类、抛出和捕获机制、原则等方面进行详细的介绍。 一、Java 异常处理机制的原理 Java 异常处理机制是 Java 语言的一大特点,它能够捕获和处理程序运行过程中的非正常情况的...
在进行Java异常处理设计时,我们需要遵循以下原则: 1. **不要直接忽略异常**:捕获到的异常应当被适当处理,无论是记录日志、通知用户还是尝试恢复。忽略异常可能会导致程序行为不可预测,甚至导致程序崩溃。 2. ...
6. **违背安全原则异常**:`SecurityException` - 安全管理器检测到不安全的操作时,会抛出此异常。 7. **文件已结束异常**:`EOFException` - 当在读取文件或流时,试图读取超出文件结尾的数据,会抛出此异常。 8...
以下是基于给定内容总结的Java异常处理的设计原则: 1. **早处理**:异常不应该用于控制正常程序流程,而应该仅用于处理非预期的情况。一旦发生异常,应尽早捕获并处理,避免异常向上冒泡到程序的更高层次。如果不...
二、异常的抛出与捕获 1. 抛出异常:当遇到预期之外的情况时,可以通过`throw`关键字抛出一个异常对象。例如,`throw new IllegalArgumentException("参数错误");` 2. 捕获异常:使用`try-catch`块来捕获并处理异常...
这个处理器就像一个安全网,当任何地方抛出异常时,它都会介入,避免程序直接崩溃。在Java中,我们可以使用`Thread.setDefaultUncaughtExceptionHandler`来设置全局异常处理器;在Python中,我们可以利用`sys....
如果try块中的代码抛出了异常,控制流会立即跳转到与之关联的catch块。 2. `catch`块:用于捕获并处理try块中抛出的异常。每个try块可以有零个或多个catch块,每个catch块捕获特定类型的异常。当异常被捕获后,程序...
- **`java.sql.SQLException`**:当与数据库交互出现问题时抛出。 - **`java.lang.NoSuchMethodException`**:当反射调用不存在的方法时抛出。 ### 运行时异常 除了上述提到的检查性异常之外,还有一些不需显式...
在这个结构中,`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块确保在任何情况下都会执行,如关闭文件流或释放资源。 3. 异常处理流程 当一个异常发生时,Java会创建一个异常对象...
2. **异常处理的原则与注意事项** - 在设计异常处理时,应始终考虑当异常发生时,如何确保系统的正常运行状态能够得到妥善处理。 - 异常处理不仅要考虑当前层次上的处理,还要考虑异常向上抛出的情况。 #### 三、...