1

我应该为我的 java 分配创建一个用于文件操作异常处理的示例程序。因为我是 C++ 人,所以我很难理解。如果有人能指出我下面代码中的缺陷,那将非常有帮助。我指的是这篇文章。Eclipse 给了我“FileNotFoundException 无法到达的 catch 块。这个异常永远不会从 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);
            }*/
        }
    }
}
4

2 回答 2

14

查看File您正在调用的构造函数的文档。它声明抛出的唯一异常是NullPointerException. 因此它不能throw FileNotFoundException,这就是你收到错误的原因。您不能尝试捕获编译器可以证明从未在相应try块中抛出的已检查异常。

创建File对象不会检查其是否存在。如果您正在打开文件(例如,使用new FileInputStream(...)then可能会抛出FileNotFoundException......但不仅仅是创建一个File对象。

于 2012-11-06T17:34:46.700 回答
2

这是因为类的构造函数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. 您的代码试图捕获一个FileNotFoundException不相关的NullPointerException,这就是您在 Eclipse 中收到此错误的原因。

一种方法是捕获类的异常,Exception这是superJava中所有异常的类。另一种方法是捕获catch被调用构造抛出的所有异常(每个异常都在不同的块中)(可以通过其 API 轻松获得)。第三种方法是只捕获对您的应用程序有意义的异常(同样是由构造实际抛出的)并忽略其他异常。

于 2012-11-06T17:39:09.083 回答