为什么我一直得到一个Arrayoutofboundsexception?

时间:2015-04-08 21:23:53

标签: java arrays indexoutofboundsexception

public class sampleCode {

    public static void main( String[] moe ) {
        int[] larry = new int[moe.length];
        for( int i=0; i<moe.length; i++ ) {
            larry[i] = Integer.parseInt( moe[i] );
        }

        int[] curly = null;
        if( larry.length <= 10 ) {
            curly = path1( larry );
        } else 
            curly = path2( larry );

        // PRINT RESULTS
        System.out.println( curly[0]+", "+curly[1] );
    }

    public static int[] path1( int[] foo ) {
        for( int i=0; i<foo.length; i++ ) {
            for(int j=0; j<foo.length-1; j++) {
                if( foo[j] > foo[j+1] ) {
                    int bar = foo[j];
                    foo[j] = foo[j+1];
                    foo[j+1] = bar;
                }
            }
        }
        return foo;
    }

    public static int[] path2( int[] foo ) {
        int[] z = null;
        if( foo.length > 1 ) {
            int bar = foo.length / 2;
            int[] a = new int[bar];
            int[] b = new int[foo.length - bar];
            for( int x=0; x<foo.length; x++ ) {
                if( x<bar ) a[x] = foo[x];
                else b[x-bar] = foo[x];
            }
            z = path2b( path2( a ), path2( b ) );
        } else {
            z = foo;
        }
        return z;
    }

    protected static int[] path2b( int[] foo, int[] bar ) {
        int i=0;
        int j=0;
        int x=0;
        int[] z = new int[foo.length+bar.length];
        while( i<foo.length || j<bar.length ) {
            if( i < foo.length && j == bar.length ) {
                z[x] = foo[i++];
            } else
            if( j < bar.length && i == foo.length ) {
                z[x] = bar[j++];
            } else
            if( foo[i] < bar[j] ) {
                z[x] = bar[j++];
            } else {
                z[x] = foo[i++];
            }
            x++;
        }
        return z;
    }
}

在Eclipse中运行此代码时,我不断获得

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at sampleCode.sampleCode.main(sampleCode.java:18)

当我尝试System.out.println()时似乎 我理解这个异常意味着什么,但我无法弄清楚我需要修复哪些代码才能使其正常运行

3 个答案:

答案 0 :(得分:1)

您的代码按预期运行。你得到了ArrayOutOfBounds异常,因为你没有将任何内容传递给Main

例如,运行带有参数3和2的程序,输出为“2,3”。

仅供参考:您可以使用“运行配置”选项向Eclipse中使用的参数添加参数。

答案 1 :(得分:0)

@Aify打败了我的答案。对于你的情况

moe.length = 0;

由于这种情况,你的初始for循环永远不会执行,因为i = 0不能小于零。由于larry.length = 0,你也会调用path1,但不会调用循环,所以path1(...)只会返回你的输入。

但是,这就是我反应的原因。调试器是你的朋友。

看看: http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-stepping.htm

如果你在第6行放置一个断点并运行调试器,它会让你更好地查看问题。

这应该让您开始从Eclipse中调试代码。

答案 2 :(得分:0)

这意味着卷曲的长度为0而不是2.因此,当您尝试访问卷曲[1]时,您将超出界限。你期待卷曲的问题。长度&gt; 1而事实并非如此。您可以通过使用断言来验证您认为真实的内容,从而更好地解决这些问题。例如:

    // PRINT RESULTS
    assert curly.length > 1 :  "curly.length < 2";
    System.out.println( curly[0]+", "+curly[1] );

为了使其正常工作,您需要将-ea选项传递给JVM。我不使用Eclipse,因此我不确定如何在Eclipse中执行此操作,但在Intellij中,您编辑运行配置并将-ea放在VM选项行中。

您需要开始验证输入的第二件事。您遇到此问题的原因是因为您在String [] moe中的初始输入不是您所期望的。

public static void main( String[] moe ) {
    if (moe.length < 2){
        System.out.println("Usage: java -jar moe.jar # # ... #");
        System.out.println("where # is a integer and has at least two integers separated by a space.");
        System.exit(0);
    }

您可能还有其他问题,但根据您给我们的内容,我可以告诉您。