我是java的初学者,参加了由普林斯顿提供的课程 Algorithm 。我按照第9页的书中的例子: BinarySearch 。
import edu.princeton.cs.algs4.*;
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)
{
In in = new In(args[0]);
int[] whitelist = in.readAllInts();
Arrays.sort(whitelist);
while (!StdIn.isEmpty())
{
int key = StdIn.readInt();
if (BinarySearch.rank(key, whitelist) == -1)
StdOut.println(key);
}
}
然而,当我编译文件时,控制台提醒我
NPP_EXEC: "java_Compile_Run"
NPP_SAVE: G:\java\binarysearch\BinarySearch.java
javac -encoding UTF-8 "G:\java\binarysearch\BinarySearch.java"
Process started >>>
<<< Process finished. (Exit code 0)
==========编译成功后开始运行==========
java -cp "G:\java\binarysearch;D:\Program Files\java\jdk\lib\algs4.jar" "BinarySearch"
Process started >>>
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at BinarySearch.main(BinarySearch.java:22)
<<< Process finished. (Exit code 1)
================ READY ================
我不知道是什么
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at BinarySearch.main(BinarySearch.java:22)
我认为没有程序错误。任何建议都有帮助。谢谢。
答案 0 :(得分:4)
我的回答就是在这里澄清一些事情。把它作为另外两个的加法。
什么是
ArrayIndexOutOfBoundsException
?
请参阅此官方定义: https://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html
我的定义:
ArrayIndexOutOfBounds
基本上就是它听起来的样子。在java中,数组是静态的(大部分时间)。创建后,会为其分配一定数量的元素。您不能尝试将元素存储在比为数组分配的元素更大的元素中。例如:
int[] nums = new int[1]; //allocate nums to have only 1 element (remember indexing starts at 0)
nums[1] = 0; //this will throw Array index OOB exception
为什么代码会抛出
ArrayIndexOutOfBoundsException
?
这是因为java运行运行其余代码的main()
方法。 Main接受名为String
的{{1}}数组的参数。此数组的内容也称为命令行参数。当你通过cmd运行代码时,你需要为它指定args[]
,就像你为任何其他函数调用指定参数一样。请记住,java索引从0开始,因此你给出的第一个arg是0,第二个是1,等等。因为你根本没有指定任何参数,所以你是不存在的访问元素。这是一个正确运行的示例:(没有我相信的引号)
args[]
如果我使用
,现在在代码中java myProgram.class "argument0", "argument1"
生病 System.out.println(args[0]);
如果您使用像Eclipse这样的IDE,这可能会有所不同。对于Eclipse,请单击“运行”菜单,然后单击“运行配置”。然后单击参数选项卡,然后指定参数。对于多个args,请使用逗号分隔。
答案 1 :(得分:3)
您的main
方法需要在启动程序时提供命令行参数。
In in = new In(args[0]);
答案 2 :(得分:1)
ArrayIndexOutOfBoundsException 表示您尝试访问数组外部的元素(即,不存在的元素)。在这里,您尝试在此行访问它:
In in = new In(args[0]);
所以,你需要修改你对程序的输入,因为看起来args []数组没有被填充。