您好,我正在通过在Java中编写一个虚拟的图书馆管理项目来学习OOP。
在serachBook()中,如果在ArrayList中找到book,它将返回book对象,如果没有找到它会抛出自定义异常BookNotFound。
问题1:它是否应该返回null并在调用代码时检查返回的值为null或抛出自定义异常BookNotFound。
目前我相信BookNotFound是合适的,我现在正在这样做。但是我发现了另一个难题:在addbook()中,我首先调用searchBook()来查看已经存在的书,如果没有,它会添加这本书。但是如果书不存在,searchBook()会抛出BookNotFound。
问题2:我应该如何处理addBook()中searchBook()抛出的这个异常,因为为了将book()添加到列表中,必须发生BookNotFound异常。那么我应该写空Catch(BookNotFound e){}?
什么可以是更好的OO练习?
答案 0 :(得分:3)
如果找不到书籍,您应该返回null
并在方法文档中说明
Exception
throwing is costly operation它也非常适合特殊情况(例如您在searchBook()
方法中传递null的书名
答案 1 :(得分:2)
返回null
。
使用异常来控制程序流是一个非常糟糕的主意。例外情况属于例外情况,未找到的书籍不是特例。
如果您的方法无法处理某个情况并希望向调用者发出信号,则会抛出异常。您可以通过返回null
来处理它。
在类似的情况下,有很多JDK类返回null
的例子,例如Map.get(key)
在地图中找不到密钥时返回null
。
答案 2 :(得分:0)
我的建议是,如果找不到这本书,可以选择返回“null”。仅使用例外处理“不那么常规”的场景,并从您的描述“搜索书”和“添加书籍”看起来像一个相当常见的场景。
使用异常涉及开销:
How slow are Java exceptions?
http://apmblog.compuware.com/2011/04/12/the-cost-of-an-exception/
答案 3 :(得分:0)
问题1:
例外情况应该是特殊情况。
书籍不存在似乎不是一个例外情况,因此返回特殊值如null
会更合适
http://codeutopia.net/blog/2010/03/11/should-a-failed-function-return-a-value-or-throw-an-exception/
问题2:
也永远不会吃掉例外。
相反,您可以编写代码以在catch块中添加book,并执行一些有用的操作,例如日志记录。
答案 4 :(得分:0)
如果找不到null
,您应该返回Book
并相应地处理它。
投掷例外是昂贵的操作,顾名思义,这些都是特殊条件。因此,在控制应用程序流程的上下文中使用它们确实被认为是一种不好的做法。
此外,使用流控制例外违反了principle of least astonishment,这使程序难以阅读和理解。
此外,编译器供应商并不期望这样。他们希望很少抛出异常,并且他们通常会让throw代码效率很低。