异常与错误处理

Java 的基本理念是“结构不佳的代码将不能运行”。
 
发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并
不能找出所有的错误,余下的问题必须在运行期间得到解决。这就需要错误源能通过某
种方式,把适当的信息传递给某个接收者,后者将知道如何正确处理这个问题。

 

使用异常所带来的另一个相当明显的好处是,它能使错误处理代码变得更有条理。与原
先“对于同一个错误,要在多个地方进行检查和处理”相比,你不必在方法调用处进行
检查(因为异常机制将保证捕获这个错误)。并且,你只需在一个地方处理错误,既所
谓的“异常处理程序”(exception handler)。这种方式不仅节省代码,而且把“描
述做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方
法相比,异常机制使代码的阅读﹑编写和调试工作更加井井有条。 

 

“异常”(exception)这个词有“我对此感到意外”的意思。问题出现了,你也许不
清楚该如何处理,但你的确知道不应该置之不理;你要停下来,看看是不是有别人或是
在别的地方,能够处理这个问题。只是你在当前的环境(current context)中没有足
够的信息来解决这个问题,所以你就把这个问题提交到一个更高级别的环境中,这里将
有人作出正确的决定(有点像军队里的指挥系统)。

 

说白了Java异常就是对问题的归咎,归咎于程序员或者归咎于用户。//在控制台和日志中打出

日志,以便问题的定位

 

对于不支持异常处理的程序语言,要想仔细检查错误,你就得在每个方法调用的前后加
上设置和错误检查的代码,甚至你每次调用同一方法时也得这么做。有了异常处理机制,
你可以把所有动作都放在 try 区块里然后只需在一个地方就可以捕获所有异常。这意
味着代码将更容易被编写和阅读,因为完成任务的代码没有与错误检查的代码混在一起。

 

 
try {
  // Code that might generate exceptions
} catch(Type1 id1) {
  // Handle exceptions of Type1
} catch(Type2 id2) {
  // Handle exceptions of Type2
} catch(Type3 id3) {
  // Handle exceptions of Type3
}
 
// etc...

 

 
异常处理程序必须紧跟在 try 块之后。当异常被抛出时,异常处理机制将负责搜寻参数
与异常类型相匹配的第一个处理程序。然后进入 catch 子句执行,此时认为异常得到了
处理。一旦 catch 子句结束,则处理程序的查找过程结束。注意,只有匹配的 catch 子
句才能得到执行;这与 switch 语句不同,switch 语句需要你在每一个 case后面跟一
个 break,以避免执行后续的 case子句。
 
注意在 try块的内部,不同的方法调用可能会产生类型相同的异常,你只需要提供一个
针对此类型的异常处理程序。

 

创建自定义异常

你不必拘泥于 Java中已有的异常类型。JDK提供的异常体系不能预见你想报告的所有
错误,所以你可以自己定义异常类来表示程序中可能遇到的特定问题。
 
要自己定义异常类,你必须从已有的异常类继承,最好是选择意思相近的异常类继承(不
过这样的异常并不容易找)。建立新的异常类型最简单的方法就是让编译器为你产生缺
省构造器,所以这几乎不用写多少代码:

 

结果通过System.err打印到控制台的标准错误流。通常这比把错误信息输出到
System.out要好,因为System.out也许会被重定向。但是把结果送到System.err,
它就不会随System.out一起被重定向,这样更容易被用户注意。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章