使用作为对象ID的String搜索arraylist中的对象?空指针问题

时间:2016-04-10 08:47:43

标签: java string arraylist nullpointerexception

在书店搜索书籍时,说对象是书,每个书籍对象都有标题,作者,ISBN代码等。

假设我使用`scan.next()'

输入ISBN作为String

我接受此输入并使用它来查找arraylist中的对象,如下所示:

public Book searchISBN (String givenISBN){
    Book foundBook = null;
    for(Book findISBN : bookStore){
        if(findISBN.getISBN().equals(givenISBN)){//edit changed this to inc. !=null as suggested
            foundBook = findISBN;}
    }    
    return foundBook;

我不明白为什么会这样。当我包含以下代码时,其目的是设置任何具有等于指定分类的空分类的书:

            if(selectedBook.getISBN().equals(null)){...

如果我使用上面的代码行运行,我会得到一个空指针异常。在这一行有一个警告,说明' object equals null永远不是真的',在创建book对象的类中String ISBN = null,因为目的是在另一个类中为此设置一个值,该类为书店创建对象,其中我的集合中的一半书籍设置为ISBN。如果它们等于null,则另一半意味着设置ISBN(在主方法

中)

不知道该如何处理。

由于问题可能出在get方法上,所以就是这样:

//the Book constructor has ISBN = null
public String getISBN(String givenClass){
    return ISBN
}

3 个答案:

答案 0 :(得分:1)

如果在此行获得NullPointerException,可能是因为引用为null而您无法在空引用上调用方法。

to

警告而是由于您使用equals()方法检查null。你应该使用==

if(selectedBook.getISBN().equals(null)){....

现在没有相关代码,我们不清楚你的程序背后的逻辑。我将尝试描述两种可能的情况。

  1. 假设selectedBook引用可以为null,则无需检查ISBN是否为null。您只需检查参考。

    if(selectedBook.getISBN() == null)){....
    
  2. 如果新创建的图书可以从您的说明中查找ISBN = null,并且如果我理解您所说的内容,则您在另一个班级中分配ISBN的值,为什么不简单地设置ISBN是默认值吗?

    if(selectedBook == null){....// your logic here
    

    然后执行检查

    String ISBN = "undefined"
    
  3. 最后,让我在这段代码中指出

    if(selectedBook.getISBN().equals("undefined"){....// your logic here
    

    ISBN似乎是Book的类型,而不是你在帖子开头提到的字符串,但是如上所述,如果没有看到你的程序的其余部分,则不清楚究竟发生了什么。

    希望很清楚。

答案 1 :(得分:0)

最有可能的是,你的getISBN()函数返回null。是的,新创建的字符串对象永远不会为空。您可以if(findISBN.getISBN()!=null && findISBN.getISBN().equals(givenISBN))检查返回的值是否为空。

答案 2 :(得分:0)

你的getISBN()可能会返回null,在if之前执行null检查。 override func viewDidLoad() { super.viewDidLoad() let frame = MyView.frame frame.origin.x += 50 MyView.frame = frame }