索引变量String参数时出现NullPointerException

时间:2012-11-16 08:16:54

标签: java string variables parameters nullpointerexception

我对使用省略号的想法不熟悉。我几乎可以肯定我的错误是由于不正确地声明或初始化“String[] authors”造成的,但我不知道如何做到这一点仍然让我的setAuthors方法有效。

import java.util.*;
public class Book {
    private String[] authors; //I'm guessing this line should end with "= new String..."
                              //but not sure how to w/o specifying an array dimension
    private int authorsSize;

    //Receives variable # of String parameters and indices them into String[] "authors"
    public void setAuthors(String... authors) {
        authorsSize = authors.length;
        for(int i=0;i<authorsSize;i++)
            this.authors[i] = authors[i];
    }

// getAuthors方法:

    public String getAuthors(){
         String s = "";
         authorsSize = authors.length;
              for(int i=0;i<authorsSize;i++)
              s = s+authors[i] + ", ";
         printAuthors = s;
         return s;
    }

5 个答案:

答案 0 :(得分:7)

最简单的方法就是克隆数组:

public void setAuthors(String... authors){
    this.authors = (String[]) authors.clone();
}

毕竟,你无论如何都要覆盖以前的数据,并且在方法调用之前你无法知道大小。此时您不需要authorsSize变量 - 您已经知道authors数组,它知道自己的长度。

(如果你能够使用不可变集合,当然你甚至不需要打扰克隆。)

编辑:如注释中所述,如果传入空引用,此方法将引发异常。你不应该自动决定这是你应该“处理”的情况 - 记录参数不能为空是完全合法的。我建议记录无效的行为

的确,如果你这样做,你可能 想要像这样初始化你的实例字段:

private String[] authors = new String[0];

这样你总会知道你在该字段中会有一个非空的引用,所以你可以使用它而不受惩罚。我更喜欢这个,因为每次使用时都要检查是否为空。

答案 1 :(得分:3)

您从未初始化authors您的数组。 你需要在使用之前初始化它。

String[] authors = new String[size];
  

//但不确定如何不指定数组维度

最好的方法是使用List实现类,因为它们是动态数组。即,您不需要指定大小。

List<String> authors = new ArrayList<String>();

答案 2 :(得分:1)

您必须按照以下说明更正setAuthors方法

public void setAuthors(String... authors) {
    if (authors != null && authors.length > 0) {
        authorsSize = authors.length;
        authors = new String[authorsSize];
        for (int i = 0; i < authorsSize; i++)
            this.authors[i] = authors[i];
    }else{
        this.authors = null;
    }
}

答案 3 :(得分:1)

因为“private String [] authors”的声明在“public void setAuthors(String ... authors)”之前,所以不能使用“String [] authors = new String [authorsSize]”之类的格式。 。这将使作者的大小始终为0。

更好的方法是使用动态初始化: List authors = new ArrayList(); 然后使用this.authors.add(authors [i])传递参数。

答案 4 :(得分:0)

您也可以像这样调整代码:

import java.util.*;
public class Book{

    private String[] authors; 
    private int authorsSize;

    public void setAuthors(String... authors){

        //check for null, you could also set this.authors = new String[] if you prefer.
        if(authors == null){
            this.authors = null;
        }else{
            authorsSize = authors.length;

            //also add this line...
            this.authors = new String[authorsSize];

            for(int i=0;i<authorsSize;i++)
                this.authors[i] = authors[i];
        }
    }

    public String getAuthors(){
         if(authors == null){
             return ""; //could also return null here if you would prefer
         }

         StringBuilder s = new StringBuilder();
         authorsSize = authors.length;
         for(int i=0;i<authorsSize;i++){
             if(i > 0)
                 s.append(",");

             s.append(authors[i]);
         }

         //printAuthors = s;
         return s.toString();
    }
}