Java 异常的处理方式(2)

报错:
ExceptionTest05.java:48: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出
                        fis.read();
                              ^
1 个错误

因为read()方法又抛出了IOException的异常,而catch()只处理了FileNotFoundException的异常。

read()方法的抛出的异常如下图所示:

Java 异常的处理方式

要想编译通过,必选进行IOException处理,
import java.io.*;
public class ExceptionTest05{
 public static void main(String[] args){
  try{
    //FileNotFoundException
    FileInputStream fis=new FileInputStream("c:/ab.txt");
    fis.read();
  }catch(FileNotFoundException e){   
  }catch(IOException e){
  }
 } 
}

或者如下直接进行IOException处理,这是因为FileNotFoundException继承IOException。
import java.io.*;
public class ExceptionTest05{
 public static void main(String[] args){
  try{
    //FileNotFoundException
    FileInputStream fis=new FileInputStream("c:/ab.txt");
    fis.read();
  }catch(IOException e){
  }
 } 
}

再看以下例子:
import java.io.*;
public class ExceptionTest05{
 public static void main(String[] args){
  try{
    //FileNotFoundException
    FileInputStream fis=new FileInputStream("c:/ab.txt");
    fis.read();
  }catch(IOException e){   
  }catch(FileNotFoundException e){
  }
 } 
}

编译出错:
ExceptionTest05.java:97: 错误: 已捕获到异常错误FileNotFoundException
              }catch(FileNotFoundException e){
                ^
1 个错误

这是因为FileNotFoundException继承IOException,catch语句块虽然可以写多个,但是从上到下catch,必须从小类型异常到大类型异常进行捕捉。并且try...catch...中最多执行一个catch语句块,执行结束后,try...catch...就执行结束了。

最后看一个详细的例子总结一下之前的内容。
import java.io.*;
public class ExceptionTest06{
 public static void main(String[] args){
  FileInputStream fis=new FileInputStream("abc");
  fis.read();
 }
}

以上程序编译无法通过,可以进行如下处理,
import java.io.*;
public class ExceptionTest06{
 public static void main(String[] args)throws IOException,FileNotFoundException{
  FileInputStream fis=new FileInputStream("c:/ab.txt");
  fis.read();
 }
}

或者进行如下处理:
import java.io.*;
public class ExceptionTest06{
 public static void main(String[] args)throws IOException{
  FileInputStream fis=new FileInputStream("c:/ab.txt");
  fis.read();
 }
}

或者使用try...catch...进行异常处理。
import java.io.*;
public class ExceptionTest06{
 public static void main(String[] args){
  try{
  FileInputStream fis=new FileInputStream("c:/ab.txt");
  fis.read();
  }catch(FileNotFoundException e){  //e内存地址指向的堆中的那个对象是FileNotFoundException类型的事件。
      System.out.println("读取的文件不存在!");
  }catch(IOException e){
    System.out.println("其它IO异常!");
  }
  System.out.println("ABC");
 }
}

运行之后输出:
读取的文件不存在!
ABC
 


如何取得异常对象的具体信息,常用的方法主要有两种:

取得异常信息描述:getMessage()

取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace();

先看取得异常的堆栈信息printStackTrace()方法。看以下例子。
import java.io.*;
public class ExceptionTest07{
 public static void main(String[] args){
  try{
    FileInputStream fis = new FileInputStream("c:/ab.txt");
  }catch(FileNotFoundException e){
    //打印异常堆栈信息
    //一般情况下都会使用该方式去调试程序
    e.printStackTrace();
  }
  //这段代码会执行
  System.out.println("ABC");
 }
}

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

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