为什么这段代码编译成功并运行成功,似乎它应该得到一个超出范围的索引

时间:2009-04-17 14:58:00

标签: java arrays exception

我正在阅读我正在处理的项目中的一些java代码,并且在其中出现了一些具有此效果的方法。

Object[] objs = null;
objs[0] = str1;
objs[1] = obj1;
for(String str: strArray)
{
    objs[objs.length+1] = str;
}

我无法弄清楚这里发生了什么。我希望有人可以解释这段代码对我的影响,最好是在高级别和幕后低级别。

6 个答案:

答案 0 :(得分:7)

那应该不会运行。 objs [0]会出错。

您确定要运行正确的文件版本吗?

答案 1 :(得分:6)

这无法用Java工作。我怀疑“这种效果”与实际代码略有不同,如果它似乎有效的话。一些问题:

  • 当你试图取消引用变量时,显然应该在第二行抛出NullPointerException
  • objs[objs.length+1]没有扩展数组,这似乎是意图 - 数组在分配后是固定大小。
  • 即使数组可以扩展,它们也是基于0的,所以你实际上想通过设置objs[objs.length]来扩展它们 - 如果这段代码有效,你就会结束所有其他元素都“缺失”

答案 2 :(得分:1)

您的第一个问题是objsnull而不是作为数组分配。第一行应该是:

Object[] objs = new Object[2];  // array 2 elements long

接下来,“数组长度”是数组的总分配大小,而不是您插入的元素数。因此,在此示例中,objs.length始终为2

因此你的循环也是错误的。

正确的代码是:

Object[] objs = new Object[ strArray.length ];  // array of the right size.
for( int k = 0 ; k < strArray.length ; k++ )
{
    objs[k] = strArray[k];
}

答案 3 :(得分:0)

  • 代码在语法上是正确的
  • 它不是独立编译,而是添加一些内容,例如

    public class Test {
        public static void main(String[] args) {
            String[] strArray = new String[]{"a","b","c","d","e","f"};
            Object obj1 = new Object();
            String str1 = "test";
            Object[] objs = null;
            objs[0] = str1;
            objs[1] = obj1;
            for(String str: strArray)
            {
                objs[objs.length+1] = str;
            }
        }
    }
    

    它会,因为它是正确的Java然后

  • 它不会在没有错误的情况下运行(NullPointerException
  • 会出现objs[0] = str1

答案 4 :(得分:0)

以下代码是您的代码,其中包含一些使其编译的修正程序会抛出NullPointerException,如预期的那样。

public class Crap
{
  public static void main (String[] args)
  {
    Object[] objs = null;
    objs[0] = "str1";
    objs[1] = new Object ();
    for(String str: new String [] { "str1", "str2" })
    {
        objs[objs.length+1] = str;
    }
  }
}


Exception in thread "main" java.lang.NullPointerException
    at Crap.main(Crap.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)

答案 5 :(得分:0)

@Jason Cohen

那些应该存储在objs数组中的str1和obj1成员呢?