Java Integer类和compareTo()

时间:2012-02-14 22:35:47

标签: java

此代码在第20行抛出空指针异常,其中调用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);
}

}

5 个答案:

答案 0 :(得分:2)

三个问题:

  1. 您只是在初始化时试图访问myArray[i+1]for循环的下一次迭代中,这会导致NPE。
  2. 您的条件为(i != myArray.length - 1),之后您就可以访问了 myArray[i+1]i == myArray.length - 1已超出范围。
  3. while循环:while (i != myArray.length - 1)从第一次开始,它似乎永远不会被终止,因为你不会在其中增加i

答案 1 :(得分:2)

执行

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

数组元素myArray[i+1]尚未设置为任何内容。它的值为null。

答案 2 :(得分:1)

您需要使用非空值初始化myArray。

答案 3 :(得分:1)

Integer[]数组初始化为10 null个值。您需要将它们设置为实际数字,或者更好 - 请改为使用int[]

如果你想保留你的逻辑,你需要两个循环 - 一个用于填充数组,另一个用于寻找最大值。

答案 4 :(得分: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;
    }
}