编译运行后输出:
java.io.FileNotFoundException: c:\ab.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at ExceptionTest07.main(ExceptionTest07.java:8)
ABC
再来看取得异常信息描述:getMessage()方法。
import java.io.*;
public class ExceptionTest07{
public static void main(String[] args){
try{
FileInputStream fis = new FileInputStream("c:/ab.txt");
}catch(FileNotFoundException e){
msg=e.getMessage();
System.out.println(msg);
}
System.out.println("ABC");
}
}
编译运行后输出:
c:\ab.txt (系统找���到指定的文件。)
ABC
从上面的例子可以看出,e.printStackTrace()比e.getMessage()的方法详细,前者输出的异常信息比后者完整,因此一般使用e.printStackTrace()来打印异常信息。捕捉了异常之后进行打印才能知道你的代码哪里出现了异常,才能不断地去修改完善自己的代码,也就是所说的一般使用e.printStackTrace()去调试程序。
接下来再补充一下方法的重写与异常的知识。
这块儿内容只要记着一个原则:重写的方法不能比被重写的方法抛出更宽泛的异常。结合以下例子来理解一下。
class A{
public void m1(){}
}
public class AB extends A{
//子类永远无法比父类抛出更宽泛的异常
public void m1() throws Exception{}
}
上述代码编译运行后出错:
AB.java:5: 错误: AB中的m1()无法覆盖A中的m1()
public void m1() throws Exception{}
^
被覆盖的方法未抛出Exception
1 个错误
这是因为子类永远无法比父类抛出更宽泛的异常。再看一个例子:
import java.io.*;
class A{
public void m1()throws FileNotFoundException{}
}
public class AB extends A{
public void m1()throws IOException{}
}
编译运行后出错:
AB.java:22: 错误: AB中的m1()无法覆盖A中的m1()
public void m1()throws IOException{}
^
被覆盖的方法未抛出IOException
1 个错误
父类中的m1()方法抛出FileNotFoundException异常,AB继承A,并且重写m1()方法,抛出IOException的异常,而我们知道,FileNotFoundException继承IOException,所以出错。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx