我正在创建一个删除方法,通过列表标题(字符串),卖方(字符串)和价格(整数)来删除项目。此方法旨在迭代每个列表以查找书籍项目。如果找到了书籍项目,那么它应该从列表中删除(即列出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);
}
}
}
答案 0 :(得分:3)
在方法开头使用初始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.在第二个和第三个循环中更正集合名称,注意复制粘贴。
答案 1 :(得分:3)
我会使用布尔来跟踪是否找到了这本书。
boolean bookFound = false;
if (/*book item found*/)
{
bookFound = true;
}
if (!bookFound)
{
throw new BookStoreException();
}
我不确定抛出异常的原因是什么,但如果原因只是想知道是否删除了某些内容,则可以返回已删除的对象,如果找不到任何内容则返回{{1} }。无论您将此方法称为删除方法,都会检查是否收到了结果或null
。这引发了很多关于是否应该使用null的讨论,因为您要删除的对象实际上可能是null
。例如:
null
这实际上是Java的if (/*book found*/)
{
/*perform remove logic*/
return book;
}
/*other checks and potential returns*/
return null;
执行删除的方式。
答案 2 :(得分:1)
您可以在方法中抛出BookStoreException
,如下所示:
if (/* book item not found */) {
throw new BookStoreException();
}
答案 3 :(得分:1)
如果您找到了停止该方法工作的图书,请使用return
。
当圈了三次而没有找到这本书时,抛出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();
}