找不到项目时抛出异常 - Java

Throwing an exception when item not found - Java

我正在创建一个删除方法,它通过列表标题(字符串)、卖家(字符串)和价格(整数)删除项目。此方法旨在遍历每个列表以查找图书项目。如果找到该书项,则应将其从列表中删除(即列表 titleMap)。如果找不到图书项目,我想抛出一个 BookStoreExeption。

我将如何在方法中抛出异常?我想过使用 while 循环,但不确定如何实现它。

如果有人能给我任何提示或问题的解决方案,那就太好了。另外,请随意批评代码,我有一种感觉,当我测试它时它不会工作。 (初学者)

@Override
public void remove(IBookItem book) throws BookStoreException{


    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getTitle())){
            bookEntry.getValue().remove(book);
            titleMap.remove();
            System.out.println("book Removed (via titleMap): " + book);
        }
    }

    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getSeller())){
            bookEntry.getValue().remove(book);
            sellerMap.remove();
            System.out.println("Book Removed (via sellerMap): " + book);
        }
    }

    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getPrice())){
            bookEntry.getValue().remove(book);
            titleMap.remove();
            System.out.println("Book Removed (via priceMap): " + book);
        }
    }   




}

您可以像这样在您的方法中抛出一个 BookStoreException

if (/* book item not found */) {
    throw new BookStoreException();
}

如果您找到停止该方法工作的书,请使用 return

循环3次没找到书时,抛出exception

示例如下:

@Override
public void remove(IBookItem book) throws BookStoreException{


    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getTitle())){
            bookEntry.getValue().remove(book);
            titleMap.remove();
            System.out.println("book Removed (via titleMap): " + book);
            return;
        }
    }

    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getSeller())){
            bookEntry.getValue().remove(book);
            sellerMap.remove();
            System.out.println("Book Removed (via sellerMap): " + book);
            return;
        }
    }

    for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
        BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
        if(bookEntry.getValue().equals(book.getPrice())){
            bookEntry.getValue().remove(book);
            titleMap.remove();
            System.out.println("Book Removed (via priceMap): " + book);
            return;
        }
    }  
    throw new BookStoreException();
}

在方法的开头创建一个初始值为 false 的布尔变量。如果在循环之一中找到该项目,将其设置为 true,并在方法结束时检查变量:

@Override
public void remove(IBookItem book) throws BookStoreException{

boolean itemFound = false;

for(Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator(); it.hasNext();){
    BookEntry<String, ArrayList<BookItem>> bookEntry = (BookEntry<String,ArrayList<BookItem>>)it.next();
    if(bookEntry.getValue().equals(book.getTitle())){
        itemFound  = true;
        bookEntry.getValue().remove(book);
        titleMap.remove();
        System.out.println("book Removed (via titleMap): " + book);
    }
}

//here other loops

if (!itemFound){
    throw new BookStoreException("Item not found!");
}}

更多提示: 1.use it.remove() 而不是titleMap.remove(),是不行的(如果改变了集合,迭代器就失效了) 2.correct第二个和第三个循环中的集合名称,注意复制粘贴。

我会使用布尔值来跟踪是否找到了这本书。

boolean bookFound = false;
if (/*book item found*/)
{
  bookFound = true;
}
if (!bookFound)
{
  throw new BookStoreException();
}

我不确定你抛出异常的原因是什么,但如果原因只是想知道是否删除了某些东西,你可以 return 被删除的对象,如果什么都没有发现 return null。无论您在何处调用此删除方法,您都会检查是否收到了结果或 null。这引发了很多关于是否应该使用 null 的讨论,因为可能您要删除的对象实际上是 null。示例:

if (/*book found*/)
{
  /*perform remove logic*/
  return book;
}
/*other checks and potential returns*/
return null;

这实际上就是 Java 的 Collections 执行删除的方式。