我正在尝试在Algorithms (4th ed.)
中运行程序package binarysearch;
import edu.princeton.cs.introcs.*;
import java.util.Arrays;
public class BinarySearch {
public static int rank(int key, int[] a)
{
int lo = 0;
int hi = a.length - 1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) hi = mid - 1;
else if (key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
}
public static void main(String[] args)
{
int[] whitelist = In.readInts(args[0]);
Arrays.sort(whitelist);
while(!StdIn.isEmpty())
{
int key = StdIn.readInt();
if (rank(key, whitelist) == -1)
StdOut.println(key);
}
}
}
运行程序的命令是
% java BinarySearch tinyW.txt < tinyT.txt
我将文本文件添加到我想要运行的包中。
我还添加了运行配置中所需的参数。
但是Eclipse告诉我这个错误信息。
我不确定为什么Eclipse无法打开文件。我手动将文件权限设置为777。有什么想法吗?
答案 0 :(得分:2)
我想你正试图重定向你的输入。看到这个。
所以tinyW.txt是你的程序参数,没关系
但是tinyT.txt不是,你只是想尝试
将tinyT.txt重定向到标准输出。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=155411
似乎Eclipse不支持此功能。
我只是尝试从Eclipse外部运行它。
答案 1 :(得分:2)
查看In
class的源代码,您似乎默默地吞下了IOException
。
Could not open tinyW.txt
这导致NullPointerException
向下,因为Scanner
内部使用的In
未初始化。
如果我不得不猜测,此异常的根本原因是FileNotFoundException
。
不要将文件放在类的包中,而是将其放在项目目录的根目录下。 Eclipse通常从该目录运行您的应用程序,因此所有相对路径(如tinyW.txt
)都与该目录相关。
一旦你解决了这个问题,就知道使用shell重定向运算符作为java参数将不会产生预期的效果。 Eclipse正在运行你的应用程序,就像这样
java binarysearch.BinarySearch "tinyW.txt < tinyT.txt"
您可以在其中明显看到<
在引号内,因此不会被shell解析器处理。
考虑使用您提供的In
课程以外的任何课程。这是一个可怕的混乱,吞噬异常等等。