如何在不获取NullPointException的情况下将数组大小加倍?

时间:2018-10-06 22:26:03

标签: java arrays nullpointerexception

首先,为了快速了解一下,这是我昨天的帖子:

How to work around a NullPointerException in Java?

所以我得到了这个NullPointerException,我现在认为是在尝试在字符串数组中找到第一个重复项的索引之前发生的。在搜索第一个重复项的索引之前,我使用以下方法将字符串数组的大小加倍:

static String[] upSizeArr( String[] fullArr )
{

    int size = fullArr.length; 
    String[] newSizeArr = new String[(2 * size)]; 
    for (int a = 0; a < size; a++) {
        newSizeArr[a] = fullArr[a];
    }
    return newSizeArr;
}

然后我在while循环的上下文中使用该方法:

static final int CAPACITY = 10;
int wordCount = 0;

BufferedReader wordFile = new BufferedReader( new FileReader(args[1]) );
String[] wordList = new String[CAPACITY];

while ( wordFile.ready() ) 
    {   if ( wordCount == wordList.length ) 
            wordList = upSizeArr( wordList );
        wordList[wordCount++] = wordFile.readLine();
    } 
wordFile.close();

使用upSizeArr方法是否可以解决此问题?我希望解决方案是基本的,并且仅使用没有其他数据结构的数组。我是编程的新手,实际上是在试图掌握基本原理……现在大约一个星期左右就在寻找此NullPointException的解决方案。

这是完整的代码:

import java.io.*;
import java.util.*;
public class Practice
{
    static final int CAPACITY = 10;
    static final int NOT_FOUND = -1;
    public static void main (String[] args) throws Exception
    {
        if (args.length < 1 )
        {
            System.out.println("\nusage: C:\\> java Practice <words filename>\n\n"); // i.e. C:\> java Lab2 10Kints.txt 172822words.txt
            System.exit(0);
        }


    String[] wordList = new String[CAPACITY];
    int wordCount = 0;
    BufferedReader wordFile = new BufferedReader( new FileReader(args[0]) );

    while ( wordFile.ready() ) // i.e. while there is another line (word) in the file
    {   if ( wordCount == wordList.length ) 
            wordList = upSizeArr( wordList );
        wordList[wordCount++] = wordFile.readLine();
    } //END WHILE wordFile
    wordFile.close(); 
    System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[0],wordList.length,wordCount );
    int dupeIndex = indexOfFirstDupe( wordList, wordCount );
    if ( dupeIndex == NOT_FOUND )
        System.out.format("No duplicate values found in wordList\n");
    else
        System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

} // END OF MAIN

// TWO METHODS 

static String[] upSizeArr( String[] fullArr )
{

    int size = fullArr.length; //find the length of the arrays
    String[] newSizeArr = new String[(2 * size)]; // creates new array, doubled in size
    for (int a = 0; a < size; a++) {
        newSizeArr[a] = fullArr[a];
    }
    return newSizeArr;

}
static int indexOfFirstDupe( String[] arr, int count )
{       
    Arrays.sort(arr);
    int size = arr.length;
    int index = NOT_FOUND;

    for (int x = 0; x < size; x++) {
        for (int y = x + 1; y < size; y++) {
            if (arr[x].equals(arr[y])) {
                index = x;
                break;
            }
        }
    }
    return index;
    }
} // END OF PROGRAM

此外,用作参数的文件是字符串的txt文件。

1 个答案:

答案 0 :(得分:2)

我不确定这是否是造成您问题的原因,但它非常可疑...

set process = GetObject("winmgmts:Win32_Process")
process.Create "calc.exe",null,null,processid
wscript.echo " PID  :   "  & Processid 

不是您应该如何读取文件的方式。相反,您应该检查while ( wordFile.ready() ) { //... } 的返回结果,当它到达文件末尾时将返回readLine

也许更像....

null

您的代码也冒着打开文件资源的风险。上面的示例利用try (BufferedReader wordFile = new BufferedReader(new FileReader(args[1]))) { String[] wordList = new String[CAPACITY]; String text = null; while ((text = wordFile.readLine()) != null) { if (wordCount == wordList.length) { wordList = upSizeArr(wordList); } wordList[wordCount++] = text; } } catch (IOException ex) { ex.printStackTrace(); } 语句来确保正确关闭该语句,而不管该操作是否成功。

查看The try-with-resources Statement了解更多详细信息。

除非有特殊要求,否则我还建议使用try-with-resourcesSystem.arraycopy,而不是像这样滚动您自己的解决方案。

也许可以看看List Implementations以获得更多详细信息

从可运行示例进行更新...

在没有可运行的代码示例的情况下播放后,ArrayList创建一个新数组时,会将新元素默认设置为upSizeArr,这是意料之中的,{{1 }}无法处理。

“ A”解决方案是使用其他非默认值填充未使用的空间...

null

“另一个”解决方案可能是“缩小”数组以适合可用数据...

Arrays.sort

所有这些尝试要做的是创建一个新数组,其大小仅大到足以包含所有非空值,然后将其返回。

然后您可以使用类似...

static String[] upSizeArr(String[] fullArr) {

    int size = fullArr.length; //find the length of the arrays
    String[] newSizeArr = new String[(2 * size)]; // creates new array, doubled in size
    for (int a = 0; a < size; a++) {
        newSizeArr[a] = fullArr[a];
    }
    for (int a = size; a < newSizeArr.length; a++) {
        newSizeArr[a] = "";
    }
    return newSizeArr;

}

在我的测试中,哪个输出

static String[] downsizeToCapacity(String[] fullArr) {
    int lastIndex = 0;
    while (lastIndex < fullArr.length && fullArr[lastIndex] != null) {
        lastIndex++;
    }
    if (lastIndex >= fullArr.length) {
        return fullArr;
    }
    String[] downSized = new String[lastIndex];
    System.arraycopy(fullArr, 0, downSized, 0, lastIndex);

    return downSized;
}