0

我有一个任务,我应该创建一个对象,该对象将字符串数组初始化为具有“大小”元素并且使用的元素数量等于 0。

我的问题是当我尝试比较字符串以将它们按字母顺序排列时。

int compare = storage[index].compareTo(value);
if (compare < 0)

这就是我得到空指针异常的运行时错误的地方

这是我的完整代码。

类主

package assignment2;
public class Main {
    public static void main(String[] args) {
        OrderedStringList myList = new OrderedStringList(5);

        System.out.println("adding 10, 5, & 7");
        myList.Insert("10");
        myList.Insert("5");
        myList.Insert("7");

        myList.Display();

        System.out.println("Value 4 find = "+ myList.Find("4"));
        System.out.println("Value 7 find = "+ myList.Find("7"));

        System.out.println("Adding 24 & 3");
        myList.Insert("24");
        myList.Insert("3");

        myList.Display();

        System.out.println("myList size: "+ myList.Size());

        if (!myList.Insert("12"))
            System.out.println("Could not add 12, full");

        System.out.println("Removing 10, adding 12.");
        myList.Delete("10");
        myList.Insert("12");

        myList.Display();
    }
}

类 OrderedStringList

package assignment2;
public class OrderedStringList {
    int length;
    int numUsed;
    String[] storage;
    boolean ordered;

    public OrderedStringList(int size){
        length = size;
        storage = new String[length];
        numUsed = 0;
    }


    public boolean Insert(String value){
        boolean result = false;
                int index = 0;
                if (numUsed < length) {
                    while (index <= numUsed) {
                        int compare = storage[index].compareTo(value);
                        if (compare < 0)
                            index++;
                    }
                    moveItemsDown(index);
                    storage[index] = value;
                    numUsed++;
                    result = true;
                }
                return result;
    }
    private void moveItemsDown(int start){
        int index;
        for (index = numUsed-1; index >=start; index--){
            storage[index+1] = storage[index];
        }
    }

    private void moveItemsUp(int start){
        int index;
        for (index = start; index < numUsed-1; index++){
            storage[index] = storage[index+1];
        }
    }

    public boolean Find(String value){
        return (FindIndex(value) >= 0);
    }

    private int FindIndex(String value) {
        int result = -1;
        int index = 0;
        boolean found = false;
        while ((index < numUsed) && (!found)) {
            found = (value.equals(storage[index]));
            if (!found)
                index++;
        }
        if (found)
            result = index;
        return result;
    }

    public boolean Delete(String value){
        boolean result = false;
        int location;
        location = FindIndex(value);
        if (location >= 0) {
            moveItemsUp(location);
            numUsed--;
            result = true;
        }
        return result;
    }

    public void Display() {
        int index;
        System.out.println("list Contents: ");
        for (index = 0; index < numUsed; index++) {
            System.out.println(index+" "+storage[index]);
        }
        System.out.println("-------------");
        System.out.println();
    }

    public void DisplayNoLF() {
        int index;
        System.out.println("list Contents: ");
        for (index = 0; index < numUsed; index++) {
            System.out.print(storage[index]+" ");
        }
        System.out.println("-------------");
        System.out.println();
    }

    public int Size(){
        return numUsed;
    }
}

多谢你们

4

4 回答 4

1

它应该是

while(index < numUsed)

如果您使用 <=,您将始终访问空列表中的索引 0,该列表将为 null。然后,当您尝试对其调用 compareTo 时,它将引发 NPE。

此外,如果 null 是要添加到列表中的合法值,则需要对 compareTo 调用进行 null 检查,并确定 null 是按字母顺序排列的第一个还是最后一个。

于 2013-02-15T19:10:54.643 回答
1

您可以使用Arrays#sort它来维护秩序,它已经在图书馆中可用。

public boolean Insert(String value){
    boolean result = false;

    if (numUsed < length) {
        storage[index] = value;
        numUsed++;
        result = true;
        Arrays.sort(storage); 
    }
    return result;
}
于 2013-02-15T19:15:43.203 回答
0

原因如下:

public boolean Insert(String value){
    boolean result = false;
            int index = 0;
            if (numUsed < length) {
                while (index <= numUsed) { // Here the first time numUsed = 0, index = 0, index <= numUsed;
                    int compare = storage[index].compareTo(value); // The first time, storage[0] == null; NullPointException is thrown
                    if (compare < 0)
                        index++;
                }
                moveItemsDown(index);
                storage[index] = value;
                numUsed++;
                result = true;
            }
            return result;
}

也许改成<=<做?

于 2013-02-15T19:10:34.590 回答
0

在第一次运行这条线

int compare = storage[index].compareTo(value);

您正在比较storage[index]哪个值nullvalue哪个值not null or empty

以实现平稳运行的替换

          while(index =< numUsed) {
        int compare = storage[index].compareTo(value);
        if(compare < 0)
            index++;
    }

 while(index < numUsed) {
        int compare = storage[index].compareTo(value);
        if(compare < 0)
            index++;
    }
于 2013-02-15T19:26:11.733 回答