捕获所有违例

我们可创建一个控制器,令其捕获所有类型的违例。具体的做法是捕获基础类违例类型Exception(也存在其他类型的基础违例,但Exception是适用于几乎所有编程活动的基础)。如下所示:
catch(Exception e) {
System.out.println("caught an exception");
}
这段代码能捕获任何违例,所以在实际使用时最好将其置于控制器列表的末尾,防止跟随在后面的任何特殊违例控制器失效。
对于程序员常用的所有违例类来说,由于Exception类是它们的基础,所以我们不会获得关于违例太多的信息,但可调用来自它的基础类Throwable的方法:

String getMessage()
获得详细的消息。

String toString()
返回对Throwable的一段简要说明,其中包括详细的消息(如果有的话)。

void printStackTrace()
void printStackTrace(PrintStream)
打印出Throwable和Throwable的调用堆栈路径。调用堆栈显示出将我们带到违例发生地点的方法调用的顺序。
第一个版本会打印出标准错误,第二个则打印出我们的选择流程。若在Windows下工作,就不能重定向标准错误。因此,我们一般愿意使用第二个版本,并将结果送给System.out;这样一来,输出就可重定向到我们希望的任何路径。
除此以外,我们还可从Throwable的基础类Object(所有对象的基础类型)获得另外一些方法。对于违例控制来说,其中一个可能有用的是getClass(),它的作用是返回一个对象,用它代表这个对象的类。我们可依次用getName()或toString()查询这个Class类的名字。亦可对Class对象进行一些复杂的操作,尽管那些操作在违例控制中是不必要的。本章稍后还会详细讲述Class对象。
下面是一个特殊的例子,它展示了Exception方法的使用(若执行该程序遇到困难,请参考第3章3.1.2小节“赋值”):
 

//: ExceptionMethods.java
// Demonstrating the Exception Methods
package c09;

public class ExceptionMethods {
  public static void main(String[] args) {
    try {
      throw new Exception("Here's my Exception");
    } catch(Exception e) {
      System.out.println("Caught Exception");
      System.out.println(
        "e.getMessage(): " + e.getMessage());
      System.out.println(
        "e.toString(): " + e.toString());
      System.out.println("e.printStackTrace():");
      e.printStackTrace();
    }
  }
} ///:~

该程序输出如下:
 

Caught Exception
e.getMessage(): Here's my Exception
e.toString(): java.lang.Exception: Here's my Exception
e.printStackTrace():
java.lang.Exception: Here's my Exception
        at ExceptionMethods.main

可以看到,该方法连续提供了大量信息——每类信息都是前一类信息的一个子集。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索exception
, getmessage tostring
, 基础
, tostring
, system
, throwable
一个
3秒违例、24秒违例、8秒违例、三秒违例、走步违例,以便于您获取更多的相关知识。

时间: 2024-08-03 01:53:48

捕获所有违例的相关文章

java违例的限制

覆盖一个方法时,只能产生已在方法的基础类版本中定义的违例.这是一个重要的限制,因为它意味着与基础类协同工作的代码也会自动应用于从基础类衍生的任何对象(当然,这属于基本的OOP概念),其中包括违例. 下面这个例子演示了强加在违例身上的限制类型(在编译期):   //: StormyInning.java // Overridden methods may throw only the // exceptions specified in their base-class // versions,

重新“掷”出违例

在某些情况下,我们想重新掷出刚才产生过的违例,特别是在用Exception捕获所有可能的违例时.由于我们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄即可.下面是一个例子: catch(Exception e) { System.out.println("一个违例已经产生"); throw e; } 重新"掷"出一个违例导致违例进入更高一级环境的违例控制器中.用于同一个try块的任何更进一步的catch从句仍然会被忽略.此外,与违例对象有关的所有东西都会得到保

java的违例规范

在Java中,对那些要调用方法的客户程序员,我们要通知他们可能从自己的方法里"掷"出违例.这是一种有礼貌的做法,只有它才能使客户程序员准确地知道要编写什么代码来捕获所有潜在的违例.当然,若你同时提供了源码,客户程序员甚至能全盘检查代码,找出相应的throw语句.但尽管如此,通常并不随同源码提供库.为解决这个问题,Java提供了一种特殊的语法格式(并强迫我们采用),以便礼貌地告诉客户程序员该方法会"掷"出什么违例,令对方方便地加以控制.这便是我们在这里要讲述的&quo

[学习笔记]Thinking in Java (the 2nd edition) Study Note (3)

笔记 第9章 违例差错控制 Java的基本原理就是"形式错误的代码不会运行".<1>在Java中,对那些要调用方法的客户程序员,我们要通知他们可能从自己的方法里"掷"出违例.这是一种有礼貌的做法,只有它才能使客户程序员准确地知道要编写什么代码来捕获所有潜在的违例.当然,若你同时提供了源码,客户程序员甚至能全盘检查代码,找出相应的throw语句.但尽管如此,通常并不随同源码提供库.为解决这个问题,Java提供了一种特殊的语法格式(并强迫我们采用),以便礼貌

引言

同人类任何语言一样,Java为我们提供了一种表达思想的方式.如操作得当,同其他方式相比,随着问题变得愈大和愈复杂,这种表达方式的方便性和灵活性会显露无遗. 不可将Java简单想象成一系列特性的集合:如孤立地看,有些特性是没有任何意义的.只有在考虑"设计".而非考虑简单的编码时,才可真正体会到Java的强大.为了按这种方式理解Java,首先必须掌握它与编程的一些基本概念.本书讨论了编程问题.它们为何会成为问题以及Java用以解决它们的方法.所以,我对每一章的解释都建立在如何用语言解决一种

java clone学习总结

由于Java中的所有东西都是句柄,而且由于每个对象都是在内存堆中创建的--只有不再需要的时候,才会当作垃圾收集掉,所以对象的操作方式发生了变化,特别是在传递和返回对象的时候.举个例子来说,在C和C++中,如果想在一个方法里初始化一些存储空间,可能需要请求用户将那片存储区域的地址传递进入方法.否则就必须考虑由谁负责清除那片区域.因此,这些方法的接口和对它们的理解就显得要复杂一些.但在Java中,根本不必关心由谁负责清除,也不必关心在需要一个对象的时候它是否仍然存在.因为系统会为我们照料一切.我们的

java克隆的控制

为消除克隆能力,大家也许认为只需将clone()方法简单地设为private(私有)即可,但这样是行不通的,因为不能采用一个基础类方法,并使其在衍生类中更"私有".所以事情并没有这么简单.此外,我们有必要控制一个对象是否能够克隆.对于我们设计的一个类,实际有许多种方案都是可以采取的: (1) 保持中立,不为克隆做任何事情.也就是说,尽管不可对我们的类克隆,但从它继承的一个类却可根据实际情况决定克隆.只有Object.clone()要对类中的字段进行某些合理的操作时,才可以作这方面的决定

java的输入流

当然,我们经常想做的一件事情是将格式化的输出打印到控制台,但那已在第5章创建的com.bruceeckel.tools中得到了简化. 第1到第4部分演示了输入流的创建与使用(尽管第4部分展示了将输出流作为一个测试工具的简单应用). 1. 缓冲的输入文件 为打开一个文件以便输入,需要使用一个FileInputStream,同时将一个String或File对象作为文件名使用.为提高速度,最好先对文件进行缓冲处理,从而获得用于一个BufferedInputStream的构建器的结果句柄.为了以格式化的

构建器

为违例编写代码时,我们经常要解决的一个问题是:"一旦产生违例,会正确地进行清除吗?"大多数时候都会非常安全,但在构建器中却是一个大问题.构建器将对象置于一个安全的起始状态,但它可能执行一些操作--如打开一个文件.除非用户完成对象的使用,并调用一个特殊的清除方法,否则那些操作不会得到正确的清除.若从一个构建器内部"掷"出一个违例,这些清除行为也可能不会正确地发生.所有这些都意味着在编写构建器时,我们必须特别加以留意. 由于前面刚学了finally,所以大家可能认为它是