异常处理允许读者为程序的正常情况单独设计和编写代码并与不正常情况下的处理代码分开
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程序中确保所有抛出的异常都被捕获尤其重要