异常处理机制
try-catch-finally
1:try-catch-finally语法一般形式
在Java中,异常通过try-catch语句捕获。其一般语法形式为:
try {
// 可能会发生异常的程序代码
} catch (Type1 id1){
// 捕获并处置try抛出的异常类型Type1
} catch (Type2 id2){
//捕获并处置try抛出的异常类型Type2
}finally {
// 无论是否发生异常,都将执行的语句块
}
2:注意catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面
- catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
- catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
例题中:Exception是NullPointerException,NumberFormatException的父类,则需要放在后面
@Test
public void test1(){
String str = "123";
str = "abc";
int num = 0;
try{
num = Integer.parseInt(str);
System.out.println("hello-----1");
}catch(NumberFormatException e){
System.out.println("出现数值转换异常了,不要着急....");
}catch(NullPointerException e){
System.out.println("出现空指针异常了,不要着急....");
}catch(Exception e){
System.out.println("出现异常了,不要着急....");
}
System.out.println("hello-----2");
}
3:在catch中常用的异常对象处理的方式:printStackTrace()
- ① String getMessage()
- ② printStackTrace()
注意:两种方式输出语句和打印结果的异同!!!
4:如要在try结构中使用变量,请生命在外部
在try结构中声明的变量,再出了try结构以后,就不能再被调用
如需使用,可以声明在外部,在内部使用。
举例:
解决方案:声明在外部,内部使用
5:finally中声明的是一定会被执行的代码**
注意:如果finally中的代码也可能出现异常,就也需要在finally中try-catch
throws + 异常类型
1:格式举例
public void readFile(String file) throws FileNotFoundException {
……
// 读文件的操作可能产生FileNotFoundException类型的异常
FileInputStream fis = new FileInputStream(file);
..……
}
“throws + 异常类型” 写在方法的声明处,
指明此方法执行时,可能会抛出异常类型。
一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出,异常代码后续的代码就不再执行
2:子类重写方法不能抛出比被父类被重写的方法范围更大的异常类型。
public class A {
public void methodA() throws IOException {
……
}
}
public class B1 extends A {
public void methodA() throws FileNotFoundException {
……
}
}
public class B2 extends A {
public void methodA() throws Exception {
//报错
……
} }
3:子类重写的方法中有异常,必须使用try-catch-finally 方式处理
4: Throws抛出可查异常和不可查的规则:
- 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
- 如果一个方法可能出现可查异常(checked exception),要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。