Java 为什么这段代码编译并运行成功?它似乎应该得到一个超出范围的索引
我在一个项目中阅读了一些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而不
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]
- 代码在语法上是正确的
- 它不是独立编译的,而是添加了一些内容,例如
它会的,因为它是正确的Javapublic 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; } } }
- 它不会在没有错误的情况下运行(
将在NullPointerException
objs[0]=str1上发生)
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设置不熟悉,我可能只是拉错了文件。