异常处理允许读者为程序的正常情况单独设计和编写代码,并与不正常情况下的处理代码分开。throw语句的作用类似一个方法调用,但它并没有去调用一个方法,而是调用了catch块。预定义的异常类Exception是所有异常类的祖先,我们也可以定义自己的异常类。

  如果程序试图使用一个越界的数组索引,会抛出一个ArrayIndexOutOfBoundsException异常,除非在一个catch块中把这个异常捕获,否则程序会结束。对于这种特殊的异常,通常不在catch中捕获它。这种异常说明代码有逻辑错误,需要更改代码而不是捕获异常,因此这种异常通常起到运行时提示错误的功能,而不是异常的功能。

  自定义异常类时,构造器通常是仅有的不是从基类中继承的方法。

  在定义异常类时,应当保留getMessage不变,为了保证这个功能,应当在自定义异常类的构造函数中调用super(message);public MySpecialException(String message)

  { super(message);…

  }

  如果要在自己的代码中插入throw语句,好定义自己的异常类,这样当自己的代码捕获一个异常时,多个catch块可以区分自己的异常和预定义的类中的方法抛出的异常,这样能更精确的捕获异常已经做异常处理(领会精神)。

  声明异常(类比推脱责任)

  加入有个方法methodA声明如下:public void methodA() throws DivideByZeroException在这种情况下,methodA免除了捕获在其执行期间所抛出的任何DivideByZeroException类型的异常的责任;而输入有一个methodB方法中包好对methodA的调用,则methodB必须捕获并处理这个异常。

  如果一个方法抛出了异常,而这个异常没有在此方法中被捕获,则这个异常抛出后,该方法的调用立即结束。

  如果某个方法在其throws子句中列出了一个异常,且某段代码中有对该方法的调用,则代码必须捕获此异常或者在throws子句中声明此异常。

  如果在派生类中重定义某方法,则重定义的方法的throws的子句不能包含基类中同一个方法的throws子句中没有列出的异常,但是可以减少重定义的方法的throws子句中声明的异常。

  断言检测失败时会抛出AssertionError类的异常,一般这个异常不会被某个catch块捕获,但是如果愿意,可以将其捕获,只是这种做法不常见。

  Error类或RuntimeException类的子孙类异常不需要被catch块捕获或被throws子句声明,其实这些类并不是异常,只是其表现类似异常,因此也把它们看做异常。

  对于多重抛出和捕获,首次捕获时需捕获更明确的异常。

  throw语句并不是抛出异常的一种语句。方法调用也能抛出异常。(明确的说,方法调用可以抛出其throws子句中声明的异常)。

  如果可以用别的方法容易解决问题,不要抛出异常。

  大多数情况下,throw语句应当用在方法内且在该方法的throws子句中声明,也是把抛出异常和捕获异常分离到单独的不同方法中去。

  在catch块内抛出异常是合法的。

  在普通的Java应用程序中没有捕获的异常会使程序在显示一个错误信息之后结束,但在GUI程序中(Jframe GUI或applet)的未捕获异常不会使程序结束,而且除非你去捕获异常,否则GUI程序可能无法应付该异常,用户也会很茫然,因此GUI程序中确保所有抛出的异常都被捕获尤其重要。