【问题标题】:Throwing an exception when item not found - Java找不到项目时抛出异常 - Java
【发布时间】:2015-10-22 21:08:33
【问题描述】:

我正在创建一个删除方法,该方法通过列表标题(字符串)、卖家(字符串)和价格(整数)删除项目。此方法旨在遍历每个列表以查找图书项目。如果找到图书项目,则应将其从列表中删除(即列表 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);
        }
    }   




}

【问题讨论】:

  • 所有三个循环都使用titleMap.iterator()。你是故意的吗?

标签: java list exception throw


【解决方案1】:

在方法的开头创建一个布尔变量,初始值为 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.用it.remove()代替titleMap.remove(),不起作用(如果改变集合,迭代器失效) 2.更正第二、第三循环中的集合名称,注意复制粘贴。

【讨论】:

    【解决方案2】:

    如果找到这本书,我会使用布尔值来跟踪。

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

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

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

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

    【讨论】:

      【解决方案3】:

      你可以像这样在你的方法中抛出BookStoreException

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

      【讨论】:

        【解决方案4】:

        如果您发现这本书阻止该方法的工作,请使用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();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-24
          • 2014-05-03
          • 2010-10-15
          • 2023-04-06
          • 2011-06-02
          相关资源
          最近更新 更多