0

你好我在这个程序中得到 NullPointerException 你能帮我吗?Author 类具有私有属性和 getter setter 方法。Fileoperations 类读取文件并使用 stringtokenizer 逐行分割。我在“ athr[0].setId(tempId);”行收到错误。当我从文件中读取 tempId 等于 100 时。我认为问题出在 Autor 类,但我无法解决。

作者

public class Author {

    private int id;
    private String name;
    private String univ;
    private String depart;
    private String email;
    private String article[] = new String[5];
    private int artCtr=0;

    public int getArtCtr() {
        return artCtr;
    }

    public void setArtCtr(int artCtr) {
        this.artCtr = artCtr;
    }

    FileOperations flp =new FileOperations();

    public String getArticle(int nmb) {
        return article[nmb];
    }

    public void setArticle(String article,int nmb) {
        this.article[nmb] = article;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUniv() {
        return univ;
    }

    public void setUniv(String univ) {
        this.univ = univ;
    }

    public String getDepart() {
        return depart;
    }

    public void setDepart(String depart) {
        this.depart = depart;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }



}

文件操作

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class FileOperations {

    Author athr[] = new Author[500];
    int athCtr = 0;
    int flag = 0;
    String temp;
    int tempId;

    public void strAthr(String path) throws IOException {
        String metin = "Suheyb";
        System.out.println(path);
        FileReader fl = new FileReader(path);

        try (BufferedReader read = new BufferedReader(fl)) {

            while (metin != null) {
                metin = read.readLine();
                if (metin != null) {
                    StringTokenizer str = new StringTokenizer(metin, "/t ");

                    if (str.hasMoreTokens()) {
                        temp = str.nextToken();
                        tempId = Integer.parseInt(str.nextToken());
                        System.out.println(tempId + " " + athCtr);

                        if (athCtr != 0) {
                            for (int i = 0; i < athCtr; i++) {
                                if (athr[i].getId() == tempId) {
                                    flag = 1;
                                    if (str.hasMoreTokens()) {
                                        athr[i].setName(str.nextToken());
                                        if (str.hasMoreTokens()) {
                                            athr[i].setDepart(str.nextToken());
                                            if (str.hasMoreTokens()) {
                                                athr[i].setEmail(str
                                                        .nextToken());
                                                if (str.hasMoreTokens()) {
                                                    athr[i].setArticle(
                                                            str.nextToken(), 0);
                                                    athr[i].setArtCtr(1);
                                                    if (str.hasMoreTokens()) {
                                                        athr[i].setArticle(
                                                                str.nextToken(),
                                                                1);
                                                        athr[i].setArtCtr(2);
                                                        if (str.hasMoreTokens()) {
                                                            athr[i].setArticle(
                                                                    str.nextToken(),
                                                                    2);
                                                            athr[i].setArtCtr(3);
                                                            if (str.hasMoreTokens()) {
                                                                athr[i].setArticle(
                                                                        str.nextToken(),
                                                                        3);
                                                                athr[i].setArtCtr(4);
                                                                if (str.hasMoreTokens()) {
                                                                    athr[i].setArticle(
                                                                            str.nextToken(),
                                                                            4);
                                                                    athr[i].setArtCtr(5);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            if (flag != 0) {
                                flag = 0;
                                athr[athCtr].setId(tempId);
                                if (str.hasMoreTokens()) {
                                    athr[athCtr].setName(str.nextToken());
                                    if (str.hasMoreTokens()) {
                                        athr[athCtr].setDepart(str.nextToken());
                                        if (str.hasMoreTokens()) {
                                            athr[athCtr].setEmail(str
                                                    .nextToken());
                                            if (str.hasMoreTokens()) {
                                                athr[athCtr].setArticle(
                                                        str.nextToken(), 0);
                                                athr[athCtr].setArtCtr(1);
                                                if (str.hasMoreTokens()) {
                                                    athr[athCtr].setArticle(
                                                            str.nextToken(), 1);
                                                    athr[athCtr].setArtCtr(2);
                                                    if (str.hasMoreTokens()) {
                                                        athr[athCtr]
                                                                .setArticle(
                                                                        str.nextToken(),
                                                                        2);
                                                        athr[athCtr]
                                                                .setArtCtr(3);
                                                        if (str.hasMoreTokens()) {
                                                            athr[athCtr]
                                                                    .setArticle(
                                                                            str.nextToken(),
                                                                            3);
                                                            athr[athCtr]
                                                                    .setArtCtr(4);
                                                            if (str.hasMoreTokens()) {
                                                                athr[athCtr]
                                                                        .setArticle(
                                                                                str.nextToken(),
                                                                                4);
                                                                athr[athCtr]
                                                                        .setArtCtr(5);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                athCtr++;

                            }

                        }

                        else {
                            System.out.println(tempId);
                            athr[0].setId(tempId);
                            System.out.println(athr[0].getId());
                            if (str.hasMoreTokens()) {

                                athr[athCtr].setName(str.nextToken());
                                if (str.hasMoreTokens()) {
                                    athr[athCtr].setDepart(str.nextToken());
                                    if (str.hasMoreTokens()) {
                                        athr[athCtr].setEmail(str.nextToken());
                                        if (str.hasMoreTokens()) {
                                            athr[athCtr].setArticle(
                                                    str.nextToken(), 0);
                                            athr[athCtr].setArtCtr(1);
                                            if (str.hasMoreTokens()) {
                                                athr[athCtr].setArticle(
                                                        str.nextToken(), 1);
                                                athr[athCtr].setArtCtr(2);
                                                if (str.hasMoreTokens()) {
                                                    athr[athCtr].setArticle(
                                                            str.nextToken(), 2);
                                                    athr[athCtr].setArtCtr(3);
                                                    if (str.hasMoreTokens()) {
                                                        athr[athCtr]
                                                                .setArticle(
                                                                        str.nextToken(),
                                                                        3);
                                                        athr[athCtr]
                                                                .setArtCtr(4);
                                                        if (str.hasMoreTokens()) {
                                                            athr[athCtr]
                                                                    .setArticle(
                                                                            str.nextToken(),
                                                                4);
                                                athr[athCtr]
                                                        .setArtCtr(5);
                                            }
                                        }
                                    }
                                }


enter code here

        }
                                    }
                                }
                            }
                            athCtr++;
                        }
                    }
                }
            }
        }
    }

}
4

4 回答 4

1

您只有定义数组Authors。但是您还没有初始化元素。(如我所见:P)
Author athr[] = new Author[500];对于引用类型数组来说是不够的。在该行之后使用它;

   for(int z=0;z<athr.length;z++){
     athr[z]=new Author();
   }

这应该有效。

于 2013-04-21T10:50:46.647 回答
1

您的数组没有任何元素!你刚刚声明了它,但你没有初始化它!作者 athr[] =新作者 [500]; 现在该数组没有任何数据,所有元素都为空!现在,当您尝试使用元素时,您会得到 NullPointException!现在先采取

    Author a= new Author(); 
    a.setName("bro");
    a.setId(123);
    arthr[0]=a; // you have an element in the first Index!
               // now, you want to initialize all
    for(int i=0; i< arthr.length; i++){
      arthr[i] =new Author();
      arthr[i].setName("bro");//you can set and get names, id's etc
}
于 2017-11-16T12:39:22.053 回答
0

您已经声明了一个类型为 的数组Author[]。这不是你想的那样。您实际上告诉 JVM 的是“为 500 个作者对象保留此空间”,但您没有指定这些对象。所以之后:

Author athr[] = new Author[500];

您有一个如下所示的数组:

{null, null, null.... null} // From 0 to 500.

new然后,您需要使用关键字为这些引用类型提供要引用的内容来填充此数组。

athr[32] = new Author();
于 2013-04-21T10:57:25.273 回答
0

我同意这个答案,而不是在使用它之前我们需要初始使用数组元素。

for(int z=0;z<athr.length;z++){
     athr[z]=new Author();
   }

但看起来您正在处理 TSV 文件并将数据存储在 Author 对象中。

以较少复杂性实现这一目标的最简单方法是

apache常见的csv示例

这真的会简化你的程序。值得一看。

## book.csv ##

作者,标题

丹·西蒙斯,Hyperion

道格拉斯·亚当斯,银河系漫游指南


读取csv的代码

List<Author> authList = ArrayList<>();
Author author = null;
Reader in = new FileReader("book.csv");
    Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
    for (CSVRecord record : records) {
        author = new Author();
        author.setAuthor(record.get(0));
        author.setTitle(record.get(1));
        authList.add(author);
    }
于 2017-11-16T13:21:42.897 回答