0

I am trying to print out a list of words from a given text, that will print it out in alphabetical order and then print out the frequencies of each word along side it.

I cannot it get to print out because I am getting this error:

Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.compareTo(String.java:1155)
    at List.insert(Count2.java:101)
    at Count2.main(Count2.java:17)

This is my code:

  import java.util.Scanner;

    public class Count2
    {
        static Scanner stdin = new Scanner(System.in);

    public static void main(String[] args)
    {
    String word;
    List sortedList = new List();
    word = nextWord();

    while(word != null)
    {
        sortedList.insert(word);
        word = nextWord();
    }
    sortedList.print();
    }



    private static String nextWord()
    {

    if(stdin.hasNext())
    {
        String word = stdin.next();
        word = word.toLowerCase();
        int start = 0;
        int end = word.length();
        for(int c = 0; c < word.length(); ++c)
        {
            if(Character.isLetter(word.charAt(c)) || word.charAt(c) == '-') 
            {
                start = c;
                break;
            }
        }
        for(int n = start; n < word.length(); ++n)
        {
            if(!(Character.isLetter(word.charAt(n)) || word.charAt(n) == '-'))
            {
                end = n;
                break;
            }
        }
        return word.substring(start,end);
    }

    else return null;


        } // nextWord


    } // end Count2

class List {
    static class Node {
        String word;
        int count;
        Node next;

        Node(String word, Node next) {
            word = word;
            next = next;
            count = 1; //the first time you add a word
        }
    }
    private Node first;
    private int numWords;

    public List() { //make an empty list
        first = null;
        numWords = 0;
    }

    public void insert(String word) 
    {
        if(first == null)
        {
            Node newNode;
            newNode= addNode(word, null);
            first = newNode;
        }
        else if (word.equals(first.word))
        {
            first.count++;
        }

        else
        {
            Node newNode;
            Node current;
            current = first;
            Node previous;
            previous = null;
            int i = word.compareTo(current.word);

            while((i > 0) && (current.next != null))
            {
                previous = current;
                current = current.next;
                i = word.compareTo(current.word);
            }

            if (( i > 0 && current.next == null))
            {
                newNode = addNode(word, null);
                current.next = newNode;
            }

            else if ( i == 0)
            { 
                current.count++;
            }

            else
            {
                newNode = addNode(word, current);

                if( previous == null)
                {
                    first = newNode;
                }

                else
                {
                    previous.next = newNode;
                }
            }

        }

    }

    private Node addNode(String word, Node next)
    {
        Node newNode = new Node(word, next);
        numWords++;
        return newNode;
    }

    public String[] getWords()
    {
        String[] WORDS = new String[numWords];
        Node current = first;
        int m = 0;

        while( current != null)
        {
            WORDS[m] = current.word;
            current = current.next;
            m++;
        }
        return WORDS;
    }

    public int[] getNumbers()
    {
        int [] numbers = new int[numWords];
        Node current = first;
        int m = 0;

        while(current != null)
        {
            numbers[m] = current.count;
            current = current.next;
            m++;
        }
        return numbers;
    }
    public void print() 
    {
        int[] numbers = getNumbers();
        String [] WORDS = getWords();

        System.out.println("Word  \t  \t  Occurs");
        System.out.println("====  \t  \t  ======");

        for( int i = 0; i < numWords; i++)
        {
            System.out.println(WORDS[i] + " \t " + numbers[i]);
        }
    }
}
anderkat97
  • 77
  • 2
  • 9
  • The heuristic for NullPointerExceptions is almost always the same. **You should critically read your exception's stacktrace to find the line of code at fault, the line that throws the exception, and then inspect that line carefully**, find out which variable is null, and then trace back into your code to see why. You will run into these again and again, trust me. In the future, please search on the subject before posting, since this is too common a problem to post yet another NPE question. – Hovercraft Full Of Eels Nov 03 '15 at 02:06
  • Here a debugger will show you that on this line: `int i = word.compareTo(current.word);` the `current.word` variable is null. – Hovercraft Full Of Eels Nov 03 '15 at 02:10
  • I don't understand how to fix this in my code. previous == null in this method so I don't understand why current.word is equal to null. @HovercraftFullOfEels – anderkat97 Nov 03 '15 at 05:38

0 Answers0