我正在尝试为学校项目创建一个互联网的小演示,我决定用Java做这个,因为这是我最熟悉的语言并完成了我的大部分工作。
因此,我为域名系统创建了type
DNS
。我还创建了一个Table
来存储网址和位置。
请参阅以下代码:
班级表:
public class Table {
private String url;
private DNS dns;
public Table(){
}
public String getURL(){ //Return url of a server
return this.url;
}
public void add(Something something){
//Some code to add something
}
}
类DNS:
public class DNS {
private Table[] table = new Table[50];
public DNS(){
//Some code here
}
public void add(Something something){ //Add a server to the DNS' table
int i = 0;
while(this.table[i].getURL() != null){ //NullPointerException
i++;
}
this.table[i].add(something);
}
}
如果我想使用DNS类中的void add()
,我必须知道table
中的下一个空位是什么。所以我尝试检索一些url
,如果它说url == null
,我知道我有一个空位。
但是我在NullPointerException
获得while(this.table[i].getURL() != null){
。这让我想知道return
变量null
是否可能{{1}}。这可能吗?如果是这样,我在这里做错了什么?
答案 0 :(得分:3)
对于您的用例,使用java.util.List
要容易得多。事实上,我会推荐java.util.ArrayList
。
它就像一个数组,除了它可以成长。
table[i]
方法存在问题,因为在您当前的代码设置中,您没有正确检测到最大值i,因此,您走过数组的末尾。要以阵列方式修复它,您可以使用for循环。
for (int i = 0; i < table.length; i++) {
// now we will loop between 0 and the last element of the array.
... table[i] ...
}
ArrayList
显示它的灵活性是指何时需要添加到阵列。如果我有一个大小为10的数组,并且我想为它添加第11个元素,则数组已满。假设我使用的是真正的数组,我需要
ArrayList
在其add(...)
方法中执行功能上与所有这些功能相同的功能。因此,您最终会编写的代码将项添加到您的表中,看起来更像是
table.add(item);
除了可以更轻松地添加项目外,ArrayList
还可以更轻松地删除项目。没有它,通常你必须编写一些代码来将项目移动到数组中间的孔中,如果你每个都删除一个条目。
答案 1 :(得分:1)
您已初始化table
数组,但尚未初始化其任何成员,因此它们都是null
。
例如,您可以在构造函数中执行此操作:
public DNS(){
for (int i = 0; i < table.length; ++i) {
table[i] = new Table();
}
}
答案 2 :(得分:0)
可以返回null的变量,但您可以简单地检查是否this.table[i] != null.