Java 异常的处理方式(3)

编译运行后输出:
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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27bb6715b56cab834e44f69d09d7f765.html