import java.io.*;
   import java.util.*;
   import javax.swing.JOptionPane;

   public class A15 {
      public static void main(String[] args) {
         if(args.length != 1) {
            JOptionPane.showMessageDialog(null, "Error: Enter one command line argument.");
         }
         else {
            try {
               String[] array = LeeJungBum15.readFileReturnWords(args[0]); // read file
               sortAndPrintArray(array, args[0]); // sort alphabetically and print the arrays
            } 
               catch(ArrayIndexOutOfBoundsException aobe) {
                  JOptionPane.showMessageDialog(null, "Error: Array is indexed out of bounds.");
               }
         }
      } // end of main
      
     /**
      * Reads file and returns word.
      * @param fileName is the String fileName
      */
      public static String[] readFileReturnWords(String fileName) throws ArrayIndexOutOfBoundsException {
         String[] array = new String[10000]; // declare String array
         Integer index = new Integer(0); // declare Integer index
        
         File file = new File(fileName); // read file
         Scanner scan = null;
         try {
            scan = new Scanner(file); // scan file
         }
            catch(FileNotFoundException fnfe) {
               JOptionPane.showMessageDialog(null, "Error: File is not found.");
            }
      	
         if(scan != null) {
            while(scan.hasNext()) {
               String word = scan.next(); // search words
               //System.out.println(word);
               array[index] = word; // store words in array
               ++index; // increment index
            }
         } 
         return array;
      }
      
     /**
      * Sorts and prints the array.
      * @param array is the String[] array
   	* @param fileName is the String fileName  
      */
      public static void sortAndPrintArray(String[] array, String fileName) throws NullPointerException {
         Sorting.display = false; // prevent the automatic output of the Sorting.java program
         Sorting.selectionSort(array); // sorts the String[] array
      	
         for(int i = 0; i < array.length; i++) {
            if(i == 0) {
               System.out.println("Alphabetical listing of words in file \"" + fileName + "\":"); // print the heading
            }
            else if(array[i] != null) {
               System.out.println("index = " + i + ", element = " + array[i]); // print indexes and elements
            }
            else {
               break; // terminate the program
            }
         }
      } // end of sortAndPrintArray
   } // end of class

This is supposed to take a filename from args[0], store each words as array and sort them alphabetically.

For example, if hello.txt contains these texts - B D E A C,
The output should be:
Index 0, Element A
Index 1, Element B
...
Index 4, Element E

However, I keep getting NullPointerException when Sorting.selectionSort(array) is activated.

If I comment that line out, it prints but it is not sorted.

Could anyone help me out? Thank you!

Recommended Answers

All 8 Replies

Looks like the array is big, and you just populate the first "n" elements from the data file, so the remaining elements are un-initialised, and give an NPE when anyone tries to compare them for sorting.

I can't use ArrayList for this assignment and it seems like there is no way to set unknown number for Arrays after searching for hours...

Copy the first "n" elements of the big array to a new array of size n, and return that.

I don't quite understand as I'm fairly new.

Do you mean something like this?
String[] newArray = array;

for(int i = 0; i < array.length; i++) {
newArray = array;
}

If i is the number of elements actually used - Yes.
But the syntax is String[] newArray = new String;
Or use Arrays.copyOf to do that for you.

Thank you!

You're confusing the array and the index. In the original code:

if(scan != null) {
while(scan.hasNext()) {
String word = scan.next();
array[index] = word;
++index; // this is also a count of the number of elements filled!
}
}
return array;

just replace the return statement with something like

return Arrays.copyOf(array, index); // returns a new array containing just the first "index" elements of "array"

Thank you so much....!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.