Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码编译并运行成功?它似乎应该得到一个超出范围的索引_Java_Arrays_Exception - Fatal编程技术网

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

Java 为什么这段代码编译并运行成功?它似乎应该得到一个超出范围的索引,java,arrays,exception,Java,Arrays,Exception,我在一个项目中阅读了一些java代码,并提出了一个方法,其中包含了类似的内容 Object[] objs = null; objs[0] = str1; objs[1] = obj1; for(String str: strArray) { objs[objs.length+1] = str; } 我搞不懂这是怎么回事。我希望有人能向我解释一下这段代码是如何工作的,最好是在高层和幕后的底层。objs[0]将给出一个错误 您确定运行的文件版本正确吗?您的第一个问题是objs是null而不

我在一个项目中阅读了一些java代码,并提出了一个方法,其中包含了类似的内容

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

我搞不懂这是怎么回事。我希望有人能向我解释一下这段代码是如何工作的,最好是在高层和幕后的底层。objs[0]将给出一个错误


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

您的第一个问题是
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];
}
Object[]objs=新对象[strArray.length];//正确大小的数组。
对于(int k=0;k
这不可能在Java中工作。我怀疑“达到这种效果的东西”与真实的代码有细微的不同,如果它看起来起作用的话。有几个问题:

  • 当您尝试取消引用变量时,它显然应该在第二行抛出一个
    NullPointerException
  • objs[objs.length+1]
    不扩展数组,这似乎是目的所在-数组在分配后是固定大小的
  • 即使可以扩展数组,它们也是基于0的,所以您实际上希望通过设置
    objs[objs.length]
    来扩展它们-如果这段代码有效,那么您最终会“丢失”所有其他元素
      • 代码在语法上是正确的
      • 它不是独立编译的,而是添加了一些内容,例如

        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上发生)

      下面的代码是您的代码,其中包含了一些使其有趣的修正,如预期的那样抛出了一个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)
      
      @杰森·科恩


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

      他在问为什么它可以工作,而看起来它显然不应该工作。比我的回答快一点,详细得多+1并删除我的。不,我只是检查了一下,看起来我运行的版本不正确。谢谢你的帮助,我担心我在学习Java的时候错过了它的一些核心功能。你用的是什么IDE?如果你正在使用记事本。。。试试Eclipse或Netbeans,它们会为您解决很多文件问题。我目前正在使用Eclipse,但由于对它和CVS设置不熟悉,我可能只是拉错了文件。