我有点失落(仍在与Ron Jeffries的书合作)。这是一个简单的课程:
public class Model{
private String[] lines;
public void myMethod(){
String[] newLines = new String[lines.length + 2];
for (i = 0, i <= lines.length, i++) {
newLines[i] = lines[i];
}
}
}
我有另一个类,通过设置Model
来初始化myModel = new String[0]
和一个空数组。当我调用myModel.myMethod()
时,我得到一个超出范围错误的下标。看一下调试器,我看到myModel.lines
的维度为零,长度为零。它的尺寸和长度不应该是1吗?当然lines[0]
的值是null
,但数组本身不应该是,如果它?
任何想法真的很感激。
兰迪
答案 0 :(得分:1)
行将为null,因此lines.length将引发异常。
我相信你的其他类初始化“模型”将无济于事,因为Lines本身是私有的。事实上,无论你对Model做什么,在至少30个州都可能是非法的。
答案 1 :(得分:1)
行被初始化为null
,检查null或以这种方式初始化它:
private String[] lines = new String[0];
答案 2 :(得分:1)
您不能通过将Model设置为String数组来初始化Model的实例。我真的很惊讶编译器会让你尝试。
如果你真的想要使用外部数组初始化Model,你应该为Model类创建一个 Constructor ,它将把数组作为参数。然后在构造函数的主体中,将行的值设置为该值。
示例:
public class Model {
private String []lines;
public Model(String [] inLines)
{
lines = inLines;
}
}
用法:
myStringArray = new String[0];
myModel = new Model(myStringArray);
答案 3 :(得分:1)
我认为您的示例可能与您基于描述的实际代码不同。我认为问题是数组是从零开始的,因此数组初始化为:
string [] lines = new string [0];
没有元素。
您需要更改循环,以便检查索引是否严格小于数组的长度。正如其他人所指出的那样,在尝试引用它之前,你还需要确保数组本身不为null。
我对你的代码的看法:
public class Model{
private String[] lines = new string[0];
public Model( string[] lines ) {
this.lines = lines;
}
public void myMethod(){
int len = 2;
if (lines != null) {
len = len + lines.length;
}
String[] newLines = new String[len];
for (i = 0, i < lines.length, i++) {
newLines[i] = lines[i];
}
}
}
答案 4 :(得分:0)
看看我的回答here - 我认为这将为您提供有关Java和C / C ++中数组初始化之间差异的背景知识。