Java文件异常处理



我应该为我的Java分配的文件操作创建一个示例程序。我很难理解,因为我是C 的家伙。如果有人可以在下面的代码中指出缺陷,那真的很有帮助。我指的是这篇文章。Eclipse给了我" filenotfoundexception的无法到达的捕获块。这个异常永远不会从try语句正文中抛出" 错误。

import java.io.*;
public class file {
    public static void main(String[] args) {
        String arg1 = args[0];
        String arg2 = args[1];
        System.out.println(arg1);
        System.out.println(arg2);
        File f1, f2;
        try {
            f2 = new File(arg2);
            f1 = new File(arg1);
        }
        catch(FileNotFoundException e) {
        /*
            if(!f1.exists()) {
                System.out.println(arg1 + " does not exist!");
                System.exit(0);
            }
            if(!f2.exists()) {
                System.out.println(arg2 + " does not exist!");
                System.exit(0);
            }

            if(f1.isDirectory()) {
                System.out.println(arg1 + " is a Directory!");
                System.exit(0);
            }
            if(f2.isDirectory()) {
                System.out.println(arg2 + " is a Directory!");
                System.exit(0);
            }
            if(!f1.canRead()) {
                System.out.println(arg1 + " is not readable!");
                System.exit(0);
            }
            if(!f2.canRead()) {
                System.out.println(arg2 + " is not readable!");
                System.exit(0);
            }*/
        }
    }
}

查看您正在调用的File构造函数的文档。例外,它被声明为 NullPointerException。因此,它不能投掷FileNotFoundException,这就是为什么您会遇到错误的原因。您无法尝试捕获编译器可以证明的检查的例外,永远不会在相应的try块中投掷。

创建File对象没有检查其存在。如果您是打开该文件(例如,使用new FileInputStream(...),则可以扔FileNotFoundException ...,而不仅仅是创建File对象。

这是因为File类的构造函数

public File(String pathname)  
Parameters:pathname - A pathname string Throws: NullPointerException - If the pathname argument is null
Throws: NullPointerException - If the pathname argument is null

仅抛出一个异常,即NullPointerException。您的代码试图捕获与NullPointerException无关的FileNotFoundException,这就是为什么您会在Eclipse中获得此错误的原因。

要走的一种方法是捕获Exception类的例外,这是Java中所有异常的super类。另一种方法是捕获调用构造抛出的所有异常(每个 catch块中的每个异常)(可以通过浏览其API轻松获得)。第三种方法是仅捕获对您的应用程序有意义并忽略其他的例外(实际上是由结构抛出的)。

最新更新