1

我正在制作这个方法 remove() ,它以字符串单词作为参数,从全局数组“单词”中删除,但由于某种我找不到的原因,我一直收到 NullPointerException,被卡了几个小时。

基本上我检查单词是否在第一个位置,否则如果在最后一个位置,或者如果它不在所以我检查所有数组,并在单词位置之前添加前半部分,然后添加数组中单词位置之后的后半部分,如跳过它并“删除它”。但是我在 for 循环中得到一个 NullPointerException 来寻找单词在数组中的位置。该方法的代码在这里:

public void remove(String a){

String[] temp_arr = new String[words.length-1]; // make array with 1 less length for deleted 

    if(words[0].equals(a)){ // if the word is the first in the array

        for(int x=0, z=1; x<temp_arr.length; x++,z++)
            temp_arr[x]=words[z];

        words = temp_arr;

    } else if(words[words.length-1].equals(a)){ // if the word is in the last position of the array

        for(int x=0, z=0; x<temp_arr.length; x++,z++)
            temp_arr[x] = words[z];

        words = temp_arr;

    } else{ // if the word is in neither first or last position of array

        // THIS IS WHERE the exception is thrown, in this for loop, in the if(words[k].equals(a))

        int k=0;
        for (; k<words.length; k++){ // find the position of the word to delete
            if (words[k].equals(a)) {
                break;
            }
        }

        for (int i = 0; i < k-1; i++){ // add first part of array before the word

            temp_arr[i] = words[i];
        }

        for(int c = k, b = k+1; c< temp_arr.length; c++,b++){
            temp_arr[c] = words[b];
        }

        words = temp_arr; // assign the new values to global array

    }
}

另外,如果有任何关于良好编码实践的建议将不胜感激,谢谢!

** 对于这种方法,我只能使用数组作为我的数据结构。

4

4 回答 4

2

像这样修改条件

a.equals(单词[0])

因为你知道字符串值 a。但不知道数组会产生什么值。因此,即使是空值也来自数组,它确实允许空指针异常。

于 2012-12-14T01:36:37.317 回答
1

我运行你的代码并发现了一些错误,我在不改变核心思想的情况下纠正了一些东西:} else { // 如果单词既不在数组的第一个也不在最后一个位置

        // THIS IS WHERE the exception is thrown, in this for loop.

        int k = -1;
        for (int i = 0; i < words.length; i++) { // find the position of the word to delete
            if (words[i].equals(a)) {
                k=i;
                break;
            }
        }
        if(k<0)//if not exists
            return;

        for (int i = 0; i < k /*- 1*/; i++) { // add first part of array before the word

            temp_arr[i] = words[i];
        }

        for (int i = k; i < temp_arr.length; i++) {
            temp_arr[i] = words[i+1];
        }

        words = temp_arr; // assign the new values to global array

    }

如果原始数组不能有空元素,我会这样做:

public static String[] remove(String words[] , String a) {
    int counter = 0;
    for (int i = 0; i < words.length; i++) {
        if( a.equals(words[i]) ){
            words[i] = null;
            counter++;
        }
    }
    if(counter==0){
        return words;
    }
    String[] words2 = new String[words.length - counter];
    int i=0;
    for (String string : words) {
        if(string!=null){
            words2[i++]=string;
        }
    }   
    return words2;
}
于 2012-12-14T02:09:16.100 回答
0

我会这样做:

public void remove(String a) {
    List<String> tmp = new ArrayList<String>();

    for (String word : words) {
        if ((word != null) && (word.equals(a))) {
            continue;
        }

        tmp.add(word);
    }

    words = tmp.toArray(new String[]);
}
于 2012-12-14T01:31:41.103 回答
0

我有一个问题问你:

为什么哦,为什么要使用数组?您应该始终使用集合(例如 a List),除非您绝对必须使用数组(这确实很少见)。

如果它是 a List,你甚至不需要这个方法,因为List有一个remove()方法可以为你做这一切!

于 2012-12-14T01:36:50.593 回答