我作为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?
答案 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在编程实践中抱怨的程度。