2012-02-14 3 views
-2

Этот код генерирует исключение нулевого указателя в строке 20, где вызывается метод compareTo(). Любые советы о том, как заставить его работать?Класс Java Integer и compareTo()

package exam1review; 

import java.util.Random; 

public class ArrayTester { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    int result, max=0; 

    Integer[] myArray = new Integer[10]; 
    Random rand = new Random(); 
    for (int i = 0; i < 10; i++) { 
     myArray[i] = rand.nextInt(); 
     System.out.println(myArray[i]); 
     while (i != myArray.length - 1) { 
      result = myArray[i].compareTo(myArray[i+1]); 
      if (result > 0) 
       max = myArray[i]; 
      else 
       max = myArray[i+1]; 
     } 
    } 
    System.out.println(max); 
} 

}

+1

Есть ли причина использовать 'Integer' вместо' int'? –

+3

также, 'i' никогда не изменяется внутри цикла while, поэтому он должен быть бесконечным. – yurib

+0

Почему вы находите максимальное значение таким образом? Это слишком сложно для такой простой задачи ... –

ответ

1

проблема в том, что вы зацикливаете на i, но ваше сравнение пытается сравнить с myArray[i+1], прежде чем оно будет установлено.

Сначала заполните массив, затем найдите максимальное значение.

Как это:

package cruft; 

import java.util.Random; 

public class ArrayTester { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Integer[] myArray = new Integer[10]; 
     Random rand = new Random(); 
     for (int i = 0; i < myArray.length; i++) { 
      myArray[i] = rand.nextInt(); 
     }   
     for (Integer value : myArray) { 
      System.out.println(value); 
     } 
     System.out.println(String.format("max value: %d", findMax(myArray))); 
    } 

    public static int findMax(Integer [] values) { 
     int max = Integer.MIN_VALUE; 

     if (values != null) { 
      for (Integer value : values) { 
       if (value.compareTo(max) >= 1) { 
        max = value; 
       } 
      } 
     } 

     return max; 
    } 
} 
+0

Спасибо. Я прав; простые ошибки, я думаю, я слишком долго не спал. –

1

Вам необходимо инициализировать туАггау со значениями, не являющихся нулевыми.

1

Баланс Integer[] инициализируется значениями 10 null. Вам нужно установить их на фактические цифры или лучше - вместо этого используйте int[].

Если вы хотите сохранить свою логику, вам понадобятся две петли - одна для заполнения массива, а другая для поиска максимального значения.

2

три вопроса:

  1. Вы пытаетесь получить доступ к myArray[i+1] в то время как вы только инициализировать его на следующей итерации вашего for цикла это causeing Вам NPE ,
  2. Ваше состояние: (i != myArray.length - 1), а затем вы получаете доступ к myArray[i+1], который не входит в число i == myArray.length - 1.
  3. while петля: while (i != myArray.length - 1) от первого галссе, кажется, он никогда не будет прерван, так как вы не увеличиваете i.
2

В точке, где вы выполнили

result = myArray[i].compareTo(myArray[i+1]); 

элемент массива myArray[i+1] еще не было установлено ни к чему. Его значение равно null.