2016-01-12 4 views
0

Я начинаю в java и беру курс Алгоритм, который предоставляется Принстоном. Я следую пример книги: BinarySearch в странице 9.Ошибка Java: Исключение из потока «main» java.lang.ArrayIndexOutOfBoundsException

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

В какой строке у вас есть ошибка – Abdelhak

+0

Вы спрашиваете, что такое исключение индекса массива из пределов? Или вы спрашиваете, что это такое? Или оба? Кроме того, @Abdelhak ошибка в строке 22 –

+0

@Abdelhak Он может генерировать класс java. Поэтому я думаю, что нет ошибки в каждой строке ... – gaoxinge

ответ

3

Ваш метод main ожидает указания аргументов командной строки при запуске программы.

In in = new In(args[0]); 
+0

@gaoxinge также, просто чтобы очистить здесь, помните, что java запускает метод main(), который запускает остальную часть вашего кода. Main принимает аргумент массива String с именем args []. Содержимое этого массива также известно как аргументы командной строки. Когда вы запускаете код через cmd, вам нужно указать args [] для его использования. Помните, что индексирование java начинается с 0, поэтому первый аргумент, который вы указываете, равен 0, второй - 1 и т. Д. Вот пример run, 'java myProgram.class" argument0 "," argument1 "'. Теперь в коде, если я использую 'System.out.println (args [0]);' Ill get '" argument0 "' –

1

ArrayIndexOutOfBoundsException означает, что вы пытались получить доступ к элементу за пределами массива (то есть, что-то, что не существует). Здесь вы пытались получить к нему доступ по этой линии:

In in = new In(args[0]); 

так, вам нужно исправить ввод в программу, потому что она будет появляться арг [] массив не заселенная.

+0

Как исправить мой ввод в программу в CMD? Можете ли вы привести пример этого? – gaoxinge

+1

@gaoxinge посмотри комментарий, который я отправил на ответ Тило. –

4

Мой ответ здесь, чтобы прояснить некоторые вещи. Возьмите это как дополнение к двум другим.

What is anArrayIndexOutOfBoundsException ?

Смотрите это для официального определения: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 

Why does the code throwArrayIndexOutOfBoundsException ?

Это потому, что Java работает метод main() который запускает остальную часть вашего кода. Main принимает аргумент массива String с именем args[]. Содержимое этого массива также известно как аргументы командной строки. Когда вы запускаете код через cmd, вам нужно указать args[], чтобы он использовался так же, как вы указывали аргументы для любого другого вызова функции. Помните, что индексирование java начинается с 0, поэтому первый аргумент, который вы указываете, равен 0, второй - 1 и т. Д. Так как вы вообще не указываете какие-либо аргументы, ваши элементы не существуют, которые не существуют.Вот пример запуска сделано правильно (без кавычек, я считаю)

java myProgram.class "argument0", "argument1" 

Теперь в коде, если я использую

System.out.println(args[0]); 

больной получает "argument0"

Если вы используете IDE, как Eclipse, это может быть немного иначе. Для Eclipse специально нажмите «Выполнить», затем «Запустить конфигурации». Затем перейдите на вкладку параметров и укажите свои аргументы. Для нескольких аргументов используйте запятую для разделения.