使用FileReader导致编译器错误“未处理的异常类型FileNotFoundException”

时间:2011-06-27 03:29:49

标签: java compiler-errors

我已经阅读了一些涉及相同问题的线程,但解决方案无法正常工作。 :/

我使用Eclipse,这是我的程序。

package mypackage;
import java.io.*;


public class myclass {


public static void main(String[] args) {
    //String myfile = "/home/jason/workspace/myproject/src/mypackage/myscript.abc";
    String myfile = "src/mypackage/myscript.abc";
    File file1 = new File(myfile);
    if(file1.exists()) {
        log(myfile + " exists. length : " + myfile.length());
    }
    else{
        log(myfile + " does not exist");
        //System.exit(1);
    }

    //FileReader fr = new FileReader("myscript.abc");//I uncomment this and die inside


    System.out.println("\nAbsPath : " + new File(".").getAbsolutePath());
    System.out.println("\nuser.dir : " + System.getProperty("user.dir"));


}

public static void log(String s){
    System.out.println(s);
}

}

我得到的错误,无论我尝试什么,或者我把myscript.abc(现在遍布整个项目目录)放在哪里都是这样的:

  

未处理的异常类型   FileNotFoundException myclass.java / myproject / src / mypackage

结束,拔毛。

6 个答案:

答案 0 :(得分:7)

  

未处理的异常类型FileNotFoundException myclass.java / myproject / src / mypackage

这是一个编译器错误。 Eclipse告诉你,你的程序没有编译成java字节代码(当然你不能运行它)。现在,您可以通过简单地声明您的程序可能抛出此异常来修复它。像这样:

public static void main(String[] args) throws FileNotFoundException {

FileNotFoundException是一个“已检查的异常”(google this),这意味着代码必须说明如果遇到JVM应该执行的操作。在代码中,try-catch块或throws声明向JVM指示如何处理异常。

为了将来参考,请注意Eclipse中的红色波浪线下划线表示存在编译器错误。如果你将鼠标悬停在问题上,Eclipse通常会建议一些非常好的解决方案。在这种情况下,一个建议是“将一个throws子句添加到main”。

答案 1 :(得分:1)

在创建文件阅读器之前,使用您创建并验证的文件描述符。此外,您可能会遇到使用相对路径的问题。为什么带有完整路径的行被注释掉了?无论如何,这里是代码:

if(file1.exists()) {
     log(myfile + " exists. length : " + myfile.length());
     FileReader fr = new FileReader(file1); 
}

答案 2 :(得分:1)

我发现您尝试指定文件的完整路径,但由于以下错误而失败:

您尚未宣布或试图抓住 java.io.FileNotFoundException

要修复它,您可以替换

FileReader fr = new FileReader("myscript.abc");

代码:

try {
    FileReader fr = 
    new FileReader("/home/jason/workspace/myproject/src/mypackage/myscript.abc");
} catch (FileNotFoundException ex) {
    Logger.getLogger(myclass.class.getName()).log(Level.SEVERE, null, ex);
}

以下代码已成功编译,它应该可以工作:

package mypackage;
import java.io.*;
// It's better to use Camel style name for class name, for example: MyClass.
// In such a way it'll be easier to distinguish class name from variable name.
// This is common practice in Java.
public class myclass {

    public static void main(String[] args) {
        String myfile = 
            "/home/jason/workspace/myproject/src/mypackage/myscript.abc";

        File file1 = new File(myfile);
        if (file1.exists()) {
            log("File " + myfile + " exists. length : " + myfile.length());
        } else {
            log("File " + myfile + " does not exist!");
        }

        try {
            FileReader fr = new FileReader(myfile);
        } catch (FileNotFoundException ex) {
            // Do something with mistake or ignore
            ex.printStackTrace();
        }

        log("\nAbsPath : " + new File(".").getAbsolutePath());
        log("\nuser.dir : " + System.getProperty("user.dir"));
    }

    public static void log(String s) {
        System.out.println(s);
    }
}

答案 3 :(得分:0)

您希望Eclipse在项目根目录中运行该程序。除非你对你的“运行”配置做了一些特别的事情,否则如果真的从那里开始,我会感到很惊讶。

尝试打印出当前的工作目录,以确保这是正确的路径。

然后尝试验证bin / build目录是否包含“* .abc”文件,因为它们不是Java源文件,可能尚未复制到编译输出目录中。

假设它们位于compliation目录中,请重写文件加载器以使用基于类别laoder路径的相对路径。这将适用于目录中的.class文件的扩展集合(以及稍后在打包的JAR文件中)。

答案 4 :(得分:0)

不是试图弄清楚发生了什么,为什么不打印发生了什么......

对您的代码进行此更改:

log(myfile.getName() + "(full path=" + myfile.getAbsolutePath() + ") does not exist");

您可能会发现它没有使用您认为的目录,或者(取决于您的文件系统)它可能正在尝试创建一个名称为"src/mypackage/myscript.abc"的文件 - 即带有嵌入斜杠的文件名。 / p>

答案 5 :(得分:0)

你只需声明抛出此异常即可修复它。像这样:



public static void main(String args[]) throws FileNotFoundException{


        FileReader reader=new FileReader("db.properties");

        Properties p=new Properties();
        p.load(reader);
    }