目录
1、异常体系结构
1、Throwable == Error + Exception
1.1、Error:java虚拟机无法解决的严重问题
1.2、Exception == CheckedException(编译时异常)+RunTimeException(运行时异常)
1.2.1、CheckedException:可以处理的异常。try-catch或者throws方式处理
常见有:IOException、ClassNotFoundException、SQLException、FileNotFoundExcepton等
1.2.2、RunTimeException:程序的逻辑错误
常见有:NullPointerException、IndexOutOfBoundsException、ClassCastException等
注意点:
1、RunTimeException类或者它的子类即使没有try-catch捕获,java自己也能捕获,并且编译通过(但运行时会发生异常使得程序运行终止)
2、如果抛出的异常是IOException等非运行时异常。必须捕获,否则编译不通过。
2、异常处理方式
2.1、try-catch-finally
定义:如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处 理。如果异常没有在调用者方法中处理,它继续被抛给这个调用 方法的上层方法。这个过程将一直继续下去,直到异常被处理。 这一过程称为捕获(catch)异常使用:try{ ...... //可能产生异常的代码}catch( ExceptionName1 e ){ ...... //当产生ExceptionName1型异常时的处置措施}catch( ExceptionName2 e ){ ...... //当产生ExceptionName2型异常时的处置措施// e.getMessage() 获取异常信息,返回字符串// e.printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置}finally{ ...... //无论是否发生异常,都无条件执行的语句}注意点:1、如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。2、通常只能处理Exception,而对Error无能为力。
2.2、throws+异常类型
定义:1、如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理2、在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。使用:public void readFile(String file) throws FileNotFoundExcepton{//FileInputStream fis = new FileInputStream(file);}注意点 :重写方法不能抛出比被重写方法范围更大的异常类型。
3、用户自定义异常
3.1、用户自定义异常一般都是RuntimeException的子类。通过throw抛出
class MyException extends Exception { // 或者继承RuntimeException
static final long serialVersionUID = 13465653435L; // 标识这个类
private int idnumber;
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}
public class MyExpTest {
public void regist(int num) throws MyException {
if (num < 0)
throw new MyException("人数为负值,不合理", 3);
else
System.out.println("登记人数" + num);
}
public void manager() {
try {
regist(100);
} catch (MyException e) {
System.out.print("登记失败,出错种类" + e.getId());
}
System.out.print("本次登记操作结束");
}
public static void main(String args[]) {
MyExpTest t = new MyExpTest();
t.manager();
}
}