【问题标题】:Why does this code compile and run successfully it seems it should get an index out of bounds为什么此代码编译并成功运行,它似乎应该使索引越界
【发布时间】:2010-10-20 03:09:42
【问题描述】:

我正在阅读我正在处理的项目中的一些 java 代码,并提出了一个具有这种效果的方法。

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

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

【问题讨论】:

    标签: java arrays exception


    【解决方案1】:

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

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

    【讨论】:

    • 不,我刚刚检查过,看起来我运行的版本不正确。感谢您的帮助,我担心在学习 Java 时会遗漏一些核心功能。
    • 您使用的是什么 IDE?如果您使用的是记事本...试试 Eclipse 或 Netbeans,它们会为您处理很多此类文件问题。
    • 我目前正在使用 Eclipse,但对它和 CVS 设置不熟悉,我可能只是下载了错误的文件。
    【解决方案2】:

    这没有希望在 Java 中工作。我怀疑“有这种效果的东西”与真正的代码有细微的不同,如果它似乎工作的话。几个问题:

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

    【讨论】:

    • 比我的回答快一点,也更详细。为此 +1 并删除我的。
    【解决方案3】:

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

    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];
    }
    

    【讨论】:

    • 他在问为什么它在看起来显然不应该工作的情况下工作。
    【解决方案4】:
    • 代码语法正确
    • 它不是独立编译的,而是有一些附加的,例如

      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)

    【讨论】:

      【解决方案5】:

      以下代码是您的代码,其中包含几个修复程序以使其同时发生,如预期的那样会引发 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)
      

      【讨论】:

        【解决方案6】:

        @杰森科恩

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

        【讨论】:

          猜你喜欢
          • 2014-09-13
          • 2018-04-02
          • 2015-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 2015-02-17
          相关资源
          最近更新 更多