线程" main"中的例外情况java.lang.NullPointerException - 方法

时间:2013-12-12 09:47:59

标签: java exception methods matrix

我是Java的新手。试图做一个简单的库,我遇到了一个问题。

  

“线程中的异常”主“java.lang.NullPointerException       在Book.showData(Book.java:22)       在Book.main(Book.java:28)   Java结果:1“

我知道如何使用一种方法来完成这项工作。但是当我使用两种方法 - 一种用于读取而另一种用于显示数据时,我得到一个错误。我认为我没有正确地使用字符串矩阵,但我真的不知道如何修复它。

import java.util.Scanner;

public class Book {
    int bookID;
    String bookName;
    String bookAuthor;
    int publishDate;


    public String readData(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Book's name: ");
        this.bookName = scanner.nextLine();
        System.out.println("\nAuthor's name: ");
        this.bookAuthor = scanner.nextLine();
        System.out.println("\nYear of publish: ");
        this.publishDate = scanner.nextInt();
        return bookAuthor;
    }

    public void showData(){ 
        String[] names = bookAuthor.split(" ");
        System.out.println(bookName+" author is "+String.format("%s %s", names[0], names[names.length-1]));
    }

    public static void main(String args[]){
        new Book().readData();
        new Book().showData();
    }
}

7 个答案:

答案 0 :(得分:4)

您正在创建Book个对象的两个实例。因此,当您在第二个上调用showData时,您的字符串未初始化(对象的默认值为null),因此当您尝试拆分{{1}时,会抛出NPE变量。

您必须创建一个bookAuthor实例,然后对其执行操作。

Book

答案 1 :(得分:1)

您在main方法中创建了Book 2次的新实例。因此,在调用showData()时,实例变量未初始化, 尝试

    Book book = new Book();
    book.readData();
    book.showData();

您也可以将readData()移到构造函数

import java.util.Scanner;

public class Book {
    int bookID;
    String bookName;
    String bookAuthor;
    int publishDate;


    public Book() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Book's name: ");
        this.bookName = scanner.nextLine();
        System.out.println("\nAuthor's name: ");
        this.bookAuthor = scanner.nextLine();
        System.out.println("\nYear of publish: ");
        this.publishDate = scanner.nextInt();
        return bookAuthor;
    }

    public void showData(){ 
        String[] names = bookAuthor.split(" ");
        System.out.println(bookName+" author is "+String.format("%s %s", names[0], names[names.length-1]));
    }

    public static void main(String args[]){
        new Book().showData();
    }
}

答案 2 :(得分:1)

您在readData()的不同实例上呼叫showData()Book。您需要创建一个Book类实例并在该实例上调用您的方法。

将您的main()更改为:

public static void main(String args[]){
    Book book = new Book();
    book.readData();
    book.showData();
}

答案 3 :(得分:1)

问题是您正在处理Book的两个不同实例。创建一个Book实例并使用readData()showData()

Book book = new Book();
book.readData();
book.showData();

答案 4 :(得分:1)

因为您创建了同一个类的两个实例而不是使用相同的类。因此,您在bookAuthor中初始化的readData()变量不再存在于showData()中。

main()功能更改为

public static void main(String args[]){
    Book foo = new Book();

    foo.readData();
    foo.showData();
}

答案 5 :(得分:1)

问题在于你的main()方法:

public static void main(String args[]){
    new Book().readData();
    new Book().showData();
}

在这一行new Book().readData();中,您正在创建新的Book实例并将数据插入到该实例中。但是,当您尝试显示数据时,您正在创建另一个实例,并尝试从那里显示数据,但它是空的,因为它是新的new Book().showData();

要修复它,您必须创建1个实例,在其中插入数据,并显示来自该类的同一实例的数据。例如:

public static void main(String args[]){
    Book book = new Book(); //create book object
    book.readData(); //insert data into it
    book.showData(); //show data from the same object
}

答案 6 :(得分:1)

您正在创建两个类Book实例。创建一个实例并调用readData()和showData()函数。 示例代码

public static void main(String args[]){
    Book myBook = new Book();

    myBook.readData();
    myBook.showData();
}

所有其他功能都可以保持不变。

抛出Nullpointer,因为在创建新实例时,showData()的字符串中没有值。