A.异常错误
1. 异常分类
所有异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception
Error异常:该层次异常描述了系统运行时内部错误和资源耗尽错误。应用程序不该抛出这种类型的对象,如果出现这种错误,除了通 告给用户,并尽力使程序安全推出,再也无能为了。这种情况很少出现。
Exception异常:该层次异常又分解为两个分支,一个派生于RuntimeException;另一个分支包含其他异常。划分为两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没问题,但是由于像I/O错误这类问题导致的异常属于其他异常。
Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受(unchecked)查异常,所有其他的异常称为受查(checked)异常。
2. 声明受查异常
- 下面四种情况应该抛出异常:
- 调用一个抛出受查异常的方法,例如,FileInputStream构造器。
- 程序运行过程中发现错误,并且利用throw语句抛出一个受查异常。
- 程序出现错误。
- java虚拟机的运行时库出现的内部错误。
如果出现前两种情况之一,则必须告诉调用这个方法的程序员有可能抛出异常。
ss
对于那些可能被别人使用的java方法,应该根域异常规范,在方法的首部声明这个方法可能抛出的异常。
如果有可能抛出多个异常,应该逗号分开
例如:
throws FileNotFoundException,EOFException
但是不需要声明Error错误,任何程序都有抛出那些异常的潜能,而我们对其没有任何控制能力。
同样也不该声明从RuntimeException继承的那些非受查异常。
警告: 如果在子类中覆盖了超类的一个方法, 子类方法中声明的受查异常不能比超类方法中声明的异常更通用 (也就是说, 子类方法中可以抛出更特定的异常, 或者根本不抛出任何异常)。特别需要说明的是, 如果超类方法没有抛出任何受查异常, 子类也不能抛出任何受查异常。例如, 如果覆盖 JComponent.paintComponent 方法, 由于超类中这个方法没有抛出任何异常,所以, 自定义的 paintComponent 也不能抛出任何受查异常。→(Java核心技术第十版_269页)
如果类中的一个方法声明将会抛出一个异常, 而这个异常是某个特定类的实例时,则这个方法就有可能抛出一个这个类的异常, 或者这个类的任意一个子类的异常。 例如,FilelnputStream 构造器声明将有可能抛出一个 IOExcetion 异常, 然而并不知道具体是哪种 IOException 异常。它既可能是 IOException 异常,也可能是其子类的异常, 例如,FileNotFoundException
3. 如何抛出异常
throw new EOFException();
或
EOFException e = new EOFException();
throw e;
下面是将代码放到一起:
String aaa(Scanner in) throws EOFException{
...
while(...){
if(...){
if(...)
throw new EOFException();
}
...
}
return s;
}
EOFException类还有含有一个字符串型参数的构造器,可以更加细致的描述异常出现情况
throw new EOFException(String data);
在这种情况下一旦方法抛出异常,这个方法就不可能返回调用者,也就是说,不必为返回的默认值或错误代码担忧:
- 找到更合适的异常类
- 创建这个类的一个对象
- 将对象抛出
4. 创建异常类
package Method;
import java.io.IOException;
class Method extends IOException { //创建异常类
Method(){}
Method(String data){
super(data);
}
}
package Method;
public class MethodTest {
public static void main(String[] args) throws Method {
test(1);
}
private static void test(int a) throws Method {
if(a>3){
throw new Method();
}else{
throw new Method("异常");
}
}
}
运行结果:
Exception in thread "main" Method.Method: 异常
at Method.MethodTest.test(MethodTest.java:11)
at Method.MethodTest.main(MethodTest.java:5)
Throwable() 构造一个新的 Throwabie 对象, 这个对象没有详细的描述信息。
Throwable(String message ) 构造一个新的 throwabie 对象, 这个对象带有特定的详细描述信息。习惯上,所有派生的异常类都支持一个默认的构造器和一个带有详细描述信息的构造器。
String getMessage() 获得 Throwabie 对象的详细描述信息。
B. 捕获异常
捕获异常必须设置try/catch
语句块。最简单的try语句块如下:
try{
code
more code
more code
}
catch(ExceptionType e){
handler for this type
}
如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么程序
1)程序将跳过try语句块的其余代码
2)程序将执行catch子句中的处理器代码
如果try语句块中没有抛出异常,你们程序将跳过catch子句
如果抛出了一个没有在catch中声明的异常,程序将退出
早抛出,晚捕捉