在null实例上是否可以使用void函数?

时间:2014-08-10 16:46:12

标签: java

我正在尝试为学校项目创建一个互联网的小演示,我决定用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}}。这可能吗?如果是这样,我在这里做错了什么?

3 个答案:

答案 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个元素,则数组已满。假设我使用的是真正的数组,我需要

  1. 创建一个大小大于或等于11的新数组。
  2. 使用正确的数组索引将旧数组中的每个元素复制到新数组。
  3. 复制在正确位置的第11个元素。
  4. 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.