Java错误:线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException

时间:2016-01-12 02:46:29

标签: java

我是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)

我认为没有程序错误。任何建议都有帮助。谢谢。

3 个答案:

答案 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 []数组没有被填充。