Justin Anderson Justin Anderson - 2 months ago 12
Java Question

Java Run Error on code that works

I am running a code that takes a list of ints, and a list of strings, and separately increases the size of the array to the proper size, and then sorts the array in a different method while also then finding an instance of a duplicate. The code is fine up to the point where I run the methods where it sorts my array and looks for duplicates. I know what the right output should be, and there should be no duplicate found in intList and a duplicate found in wordList at index 45788. I have asked for help from others doing this same simple task, and have the same code as them. I have to be off somewhere but I cannot find where. I attached a photo of the two methods next to the output in the command prompt. Thanks for any help

import java.io.*;
import java.util.*;

public class Lab4
{
static final int INITIAL_CAPACITY = 10;
static final int NOT_FOUND = -1; // indexOfFirstDupe returns this value if no dupes found

public static void main (String[] args) throws Exception
{
// ALWAYS TEST FIRST TO VERIFY USER PUT REQUIRED INPUT FILE NAME ON THE COMMAND LINE
if (args.length < 1 )
{
System.out.println("\nusage: C:\\> java Lab4 <numbers file> <words filename>\n\n"); // i.e. C:\> java Lab4 10000ints.txt 172822words.txt
System.exit(0);
}

String[] wordList = new String[INITIAL_CAPACITY];
int[] intList = new int[INITIAL_CAPACITY];
int wordCount = 0, intCount=0;
Scanner intFile = new Scanner( new File(args[0]) );
BufferedReader wordFile = new BufferedReader( new FileReader(args[1]) );

// P R O C E S S I N T F I L E
while ( intFile.hasNextInt() ) // i.e. while there are more ints in the file
{
if ( intCount == intList.length )
intList = upSizeArr( intList );
intList[intCount++] = intFile.nextInt();

} //END WHILE intFile

//close intfile
intFile.close();

//output text with variables
System.out.format( "%s loaded into intList array. size=%d, count=%d\n",args[0],intList.length,intCount );

int dupeIndex = indexOfFirstDupe( intList, intCount );

if ( dupeIndex == NOT_FOUND )
{
System.out.format("No duplicate values found in intList\n");
}
else
{
System.out.format("First duplicate value in intList found at index %d\n",dupeIndex);
}

// P R O C E S S S T R I N G F I L E
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

//closing wordfile
wordFile.close();

//output text again with variables
System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[1],wordList.length,wordCount );

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);

}
}

// --------------------------------------------------------------------------------------------------------------------------------

// method to double size of string array

static String[] upSizeArr( String[] fullArr )
{
int length = fullArr.length;

//creating a new array of double size
String[] upsizearr = new String[length*2];

//this for loop assigns each old variable in fullArr
//and assigns it to the new larger array, upsizearr
for(int i = 0; i<length-1; i++)
{
upsizearr[i] = fullArr[i];
}

return upsizearr;
}


// method to double size of int array

static int[] upSizeArr( int[] fullArr )
{
int length = fullArr.length;

//creating new array of double size
int[] upsizearr = new int[length*2];

//this loop does the same as in upSizeArr method,
//assigning all values to new bigger array
for(int i = 0; i<length-1; i++)
{
upsizearr[i] = fullArr[i];
}

return upsizearr;
}


// use Arrays.sort() before scanning for dupe
static int indexOfFirstDupe( int[] arr, int count )
{
Arrays.sort(arr);
int value = NOT_FOUND;

for(int i = (arr.length - count); i < count; i++)
{
if(arr[i] == arr[i-1])
{
value = i;
break;
}
}

return value;
}


// use Array.sort() before scanning for dupe
static int indexOfFirstDupe( String[] arr, int count )
{

Arrays.sort(arr);
int value = NOT_FOUND;

for(int i = (arr.length - count); i < count; i++)
{
if(arr[i] == arr[i-1])
{
value = i;
break;
}
}

return value;
}

} // END CLASS


[cmd and sorting/finding dupe arrays]
[code where errors occur]2

Answer

It looks like your code is encountering a null value when looping through the word list array. While looking through your code, it appears that the issue might exists in the int list as well. So... a couple of things to correct. Change the way you are setting ints and words to the arrays by incrementing the intCount and wordCount variables last in the while-loops.

When loading ints into the intList...

// P R O C E S S   I N T   F I L E 
    while ( intFile.hasNextInt() ) // i.e. while there are more ints in the file
    {   
        if ( intCount == intList.length ) 
            intList = upSizeArr( intList );
        intList[intCount] = intFile.nextInt();
        intCount++;
    } //END WHILE intFile

When loading words into the wordList

    // P R O C E S S   S T R I N G    F I L E
    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();
        wordCount++;
    } //END WHILE wordFile