2017-12-27 470 views
0

我试图运行下面的脚本:https://algs4.cs.princeton.edu/15uf/UF.java的Java的Eclipse:运行程序与文件参数和外部JAR

要做到这一点,我有:

1)打开Eclipse中,提出了一个新的项目命名为UF,并创建了一个名为UF的新类,并在该类的内部粘贴了上述链接中的代码。

2)通过在其网站上的说明,我

/usr/local/algs4/algs4.jar 

3)用鼠标右键单击该项目,赴属性下保存自己的JAR文件和库选项卡下有两个选项字段ModulePath进行和Classpath。使用Modulepath突出显示,我单击添加外部JAR并导航到algs4.jar的位置。然后我对Classpath也做了同样的事情,因为我认为其中一个必须是正确的。

4)该文件是用于输入到程序:https://algs4.cs.princeton.edu/15uf/tinyUF.txt

所以我保存这个~/Documents下。

5)在Run选项下,我选择Run Configurations,单击Arguments选项卡,然后键入/home/me/Documents/tinyUF.txt

6)现在,当我运行程序时什么都没有发生,我的意思是它绝对没有显示运行的唯一例外,当我将鼠标移到运行按钮上时它说“运行(已经运行)” 。

7)所以仅仅为了测试的目的,我在主函数System.out.println("TEST");的第一行插入,这一次当我运行它时,它显示Eclipse底部的控制台并打印TEST。 8)如果我将System.out.println("TEST");行向下移动一行,以便int n = StdIn.readInt();先运行,那么控制台将显示但没有打印,程序也不会停止。

有关发生了什么的任何想法?

[编辑:我想我应该注意到我在Linux Mint 18.3 Cinnamon上运行Oxygen.2 Release(4.7.2)。当我按照指示安装Eclipse时,他们似乎有点奇怪,但我仍然依照他们:它指示我将文件夹/root/eclipse安装到该文件夹​​,所以我做到了。]

[更新:与评论者,我发现我不得不将输入文件路径添加到启动配置中。现在我已经这样做了,程序正确地读入txt文件并输出正确的结果,除了它从不打印最后一行并永不终止程序。看代码:

public static void main(String[] args) { 
     int n = StdIn.readInt(); 
     UF uf = new UF(n); 
     while (!StdIn.isEmpty()) { 
      int p = StdIn.readInt(); 
      int q = StdIn.readInt(); 
      if (uf.connected(p, q)) continue; 
      uf.union(p, q); 
      StdOut.println(p + " " + q); 
     } 
     StdOut.println(uf.count() + " components"); 
    } 

当代码运行时的行为是,它成功完成while循环,但从未达到行StdOut.print]ln(uf.count() + " components");

+0

你在调试器下运行你的代码了吗?如果在程序等待时从键盘输入一些数字,会发生什么? –

+0

@ PM77-1我猜“调试器”意味着在运行去调试。我试了一下,控制台显示它正在运行,但它永远不会终止。如果我运行它并输入1它打印测试,然后我输入2,它打印B(我也插入'System.out.println(“B”);'只是在while循环内,忘记提及),然后如果我输入4它引发异常,因为大概我输入了程序无法理解的数字。所以我认为这里的答案是它没有正确读取输入文本文件。 – Addem

+0

按照[本教程](https://www.eclipse.org/community/eclipse_newsletter/2017/june/article1.php)设置*断点*并按照进一步的步骤进行调试。 –

回答

0

默认情况下,eclipse根目录是项目的基础目录。因此,如果您在此处以调试模式运行,则您的参数需要包含绝对路径(以驱动器号开头),例如C:/usr/local/algs4/algs4.jar,或者您需要将文件放在运行程序的同一文件夹中。

只是给/home/me/Documents/tinyUF.txt告诉程序从那里它是目前,寻找主目录,我的目录下钻..等

它总是更直接,更安全给的绝对路径。如果路径将变化/动态,则允许jar接受参数。检查main()中的参数并将其设置为File inputFile = arg[0]变量,然后以此方式处理该文件。

+0

我想你可能会假设我正在使用Windows计算机。我正在运行Linux Mint,如果我理解正确,'/ home/...'实际上会提供根目录中的绝对路径。 – Addem

+0

我从来没有听说过将jar导出为runnable,但可能没有必要,因为在与评论者的对话中,我取得了一些进展。事实证明,要将文件作为输入传递给程序,必须提供启动配置的路径。这样做后,程序几乎可以工作,它读入文件并输出许多正确的信息。但是,当它退出while循环时,它永远不会运行while循环之后的代码。 – Addem

+0

很高兴你能够取得一些进展。对于早期退出问题,您是否想要浓缩并共享该部分代码? –