2013-12-12 100 views
1

我是Java新手。试图做一个简单的图书馆,我遇到了一个问题。线程“main”中的异常java.lang.NullPointerException - 方法

“异常在线程 ”主“ 显示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(); 
    } 
} 
+2

对于showData(),您正在使用Book的新实例,所以所有字段都未初始化 – lummycoder

回答

4

您建立Book对象的两个实例。因此,当您在第二次调用showData时,您的字符串未初始化(对象的默认值为null),因此当您试图在bookAuthor变量上分割时引发NPE。

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

Book b = new Book(); 
b.readData(); //<-- here you initialize the value fields for this instance (the instance b) 
b.showData(); //<-- it's ok to use them now, they have been initialized ! 
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(); 
    } 
} 
1

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

更改您的main()这样的:

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

的问题是,您正在使用的Book两种不同的情况下工作。创建Book的一个实例并使用readData()showData()

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

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

更改main()功能

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

    foo.readData(); 
    foo.showData(); 
} 
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 
} 
1

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

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

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

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

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

相关问题