Java:运行长度编码实现

时间:2014-04-06 07:35:37

标签: java run-length-encoding

我已经实现了一个应该使用游程编码压缩或扩展标准输入的二进制输入的类。我修复了我的IDE标记的所有错误,但是当我实际运行它时出现错误。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at runlength.RunLength.main(RunLength.java:49)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)

在代码中,第49行如下:

    switch (args[0]) {

here is the full code: 

package runlength;

import edu.princeton.cs.introcs.BinaryStdIn;
import edu.princeton.cs.introcs.BinaryStdOut;


public class RunLength {
    private static final int R   = 256;
    private static final int lgR = 8;

    public static void expand() { 
        boolean b = false; 
        while (!BinaryStdIn.isEmpty()) {
            int run = BinaryStdIn.readInt(lgR);
            for (int i = 0; i < run; i++)
                BinaryStdOut.write(b);
            b = !b;
        }
        BinaryStdOut.close();
    }

    public static void compress() { 
        char run = 0; 
        boolean old = false;
        while (!BinaryStdIn.isEmpty()) { 
            boolean b = BinaryStdIn.readBoolean();
            if (b != old) {
                BinaryStdOut.write(run, lgR);
                run = 1;
                old = !old;
            }
            else { 
                if (run == R-1) { 
                    BinaryStdOut.write(run, lgR);
                    run = 0;
                    BinaryStdOut.write(run, lgR);
                }
                run++;
            } 
        } 
        BinaryStdOut.write(run, lgR);
        BinaryStdOut.close();
    }


    public static void main(String[] args) {
        switch (args[0]) {
            case "-":
                compress();
                break;
            case "+":
                expand();
                break;
            default:
                throw new IllegalArgumentException("Illegal command line argument");
        }
    }

}

如果有人能向我解释我的问题是什么,我会非常感激。

1 个答案:

答案 0 :(得分:0)

您正在获取ArrayIndexOutOfBoundsException: 0,因为您正在尝试访问数组args的第一个元素,但这没有任何元素。

你能做什么?

  • 启动时,您应该将command-line arguments传递给该程序。
  • 在访问其元素之前,您可以检查args的长度是否大于0

    if (args.length > 0)
        // ...