当我使用字符串作为文件名时,eclipse扫描程序filenotfoundexception

时间:2014-02-15 16:12:04

标签: java eclipse

我作为CS学生一直使用记事本。在记事本中,以下工作正常

class someclass {

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

        Scanner in = new Scanner(new File("some.txt"));
    }
}

在netbeans中,我必须使用“”中包含的实际完整路径,并将代码放在try catch中。

然而,在日食中,没有任何接缝可以工作。如果我在“”中使用完整路径名,它会给我一个转义序列错误。如果我只使用上面列出的代码,使用try catch,使用.close(),我仍然会得到filenotfound ....请告知。

ps,对于我自己的启发,为什么我不必在记事本中关闭或使用try catch?

2 个答案:

答案 0 :(得分:1)

  

为什么我不必在记事本中关闭或使用try catch?

理论上,您不需要在IDE中执行此操作,但IDE比编译器更进一步,并警告您关于非封闭资源等;如果您的IDE配置如此,此类警告可能会出错。关于try / catch,这看起来很奇怪,因为您声明main要投掷Exception

但IDE在这里是正确的:当你打开一个Closeable资源时,你应该.close()完成它。

  

如果我在“”中使用完整路径名,它会给我一个转义序列错误

狂野猜测:您使用Windows,并在两个引号之间直接粘贴C:\myfile.txt之类的路径。这确实是一个格式错误的字符串:Java字符串中的反斜杠需要加倍。

  

我必须使用“”

中包含的实际完整路径

这意味着进程的工作目录不在您认为的位置。通常,在IDE中,工作目录是项目根目录。将文件移动到此工作目录或使用完整路径。

答案 1 :(得分:0)

  

在记事本中,以下工作正常

考虑一下如何运行代码。我可能会做出假设,但我相信它会是这样的。

javac -cp . Someclass.java
java SomeClass

你的目录结构看起来像这样。

* 请注意/ someTestproject是我为此示例编写的目录

/someTestProject
/someTestProject/Someclass.java
/someTestProject/Someclass.class
/someTestProject/some.txt

当您的应用程序运行时,它会查找与其执行路径相关的资源。如果您从命令行运行,它会查找相对于您所在目录的some.txt(在本例中为/ someTestProject)。

然而,在IDE世界中,事情并非如此简单。您的源文件夹永远不是您的构建&运行文件夹。因此,如果项目的源文件夹中有some.txt,则很可能在运行时找不到它。下面说明了大多数IDE的工作方式。

/workspace/project/src
/workspace/project/class

其中../src是所有java文件所在的位置,而/ class是所有已编译类所在的位置。

有一些解决此问题的方法,但它们根据您使用的IDE而有所不同。我自己有一段时间没有使用netbeans,但我相信你可以在项目设置中找到你的执行目录。在eclipse中,您只需将文件拖到项目中,但在src文件夹之外。

  

在netbeans中,我必须使用“”中包含的实际完整路径,然后放入   try中的代码也可以捕获。

当您打开文件some.txt时,资源位于运行时。 Scanner类声明它会在无法找到文件的情况下抛出FileNotFoundException。您应该在try / catch中处理此问题以优雅地退出或声明您的main抛出FileNotFoundException,这将导致程序在发生时崩溃。

  

然而,在日食中,没有任何接缝可以工作。如果我使用完整路径   在“”中的名称它给我一个转义序列错误...

我猜你正在使用Windows。请记住,在Java字符串中,反斜杠\是一个转义字符。想想\ n(换行符)\ t(制表符)或如何在字符串“\”Hello \“中包含引号,sam说。

如果您尝试以下操作,则会失败。

Scanner sc = new Scanner(new File("C:\Users\you\Desktop\some.txt"));

在Windows上你应该使用

Scanner sc = new Scanner(new File("C:\\Users\\you\\Desktop\\some.txt"));

请记住,要在字符串中包含反斜杠,必须使用两个反斜杠。

  

为了我自己的启发,为什么我不必关闭或使用try catch   记事本?

由于您的异常是在main中抛出的,因此不需要在try / catch中声明或包装它。但是,IDE尝试强制执行良好的编程习惯。我相信大多数IDE都有一个设置,允许您控制IDE在编程实践中抱怨的程度。