0

I tried running this code that is a move-to-front encoder, but I get this exception:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at MTFencoder.main(MTFencoder.java:10)

Could someone explain why this happens?

import java.io.FileReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;
import java.io.IOException;

public class MTFencoder {
    public static void main(String[] args) {
        String filename = args[0];
        WordList wordList = new WordList();

        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader(filename));
            StringTokenizer st;
            int index;

            while ((line = br.readLine()) != null) {
                st = new StringTokenizer(line);

                while (st.hasMoreTokens()) {
                    String currentword = st.nextToken();

                    if (wordList.hasElement(currentword)) {
                        index = wordList.Index(currentword);
                        wordList.remove(currentword);
                        wordList.add(currentword);
                        System.out.println(Integer.toString(index));
                    } else {
                        wordList.add(currentword);
                        System.out.println("0" + currentword);
                    }
                }
            }
        } catch (IOException e) {
        }
    }
}


class Node {
    private String word;
    private Node next;

    public Node(String w) {
        word = w;
        next = null;
    }

    public String getWord() {
        return word;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node n) {
        next = n;
    }
}


class WordList {
    Node head;

    public WordList() {
    }

    public void add(String w) {
        Node n = new Node(w);
        n.setNext(head);
        head = n;
    }

    public int length() {
        Node tmp = head;
        int count = 0;
        while (tmp != null) {
            count++;
            tmp = tmp.getNext();
        }
        return count;
    }

    public boolean hasElement(String w) {
        Node tmp = head;
        while (tmp != null) {
            if (tmp.getWord().equals(w)) return true;
            tmp = tmp.getNext();
        }
        return false;
    }

    public void remove(String w) {
        if (!hasElement(w)) return;
        if (head.getWord().equals(w)) {
            head = head.getNext();
            return;
        }
        Node tmp = head;
        while (!(tmp.getNext().getWord().equals(w))) tmp = tmp.getNext();
        tmp.setNext(tmp.getNext().getNext());
    }

    public void dumpList() {
        for (Node tmp = head; tmp != null; tmp = tmp.getNext())
            System.out.println(" >> " + tmp.getWord());
    }

    public int Index(String w) {
        int counter = 1;
        Node temp = head;
        while (!(temp.getWord().equals(w))) {
            counter++;
            temp = temp.getNext();
        }
        return counter++;
    }
}
1
  • How do you run this program?? Commented Apr 1, 2013 at 4:54

1 Answer 1

4

The program expects command line arguments. You aren't passing it.

The program needs to be run as java MTFencoder fileyouwanttoprocess. You aren't passing the filename parameter.

This is line 10

String filename = args[0];

args[0] is the first command line argument - you aren't passing command line arguments.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.