我正在阅读一些有关Java中异常处理的内容,以便能够编写更好的代码。好吧,我承认,我有罪。我使用了太多try-catch {}块,ex.printStackTrace()在捕获中使用了它,甚至没有使用适当的记录器(实际上是System.out和System.err被重定向到PrintWriter,因此生成了日志)。但是,经过几个小时的阅读,我发现自己在一个陌生的地方:未知。如果异常被设计为传递有关异常流状态的信息,那么人们如何知道WHERE是使用该信息执行操作的适当级别?
ex.printStackTrace()
System.out
System.err
PrintWriter
例如,当发生数据库错误时,应该返回空值或错误代码还是引发异常?如果抛出异常,应该在哪里处理该异常?我了解即使您无法对此做任何记录,甚至记录异常也没有用。但是,在GUI应用程序中,这很容易杀死您的GUI(我正在使用SWT,而且我经常看到这种情况),即使是使用该menuShown()方法的情况(ArrayIndexOutOfBounds如果未处理,异常也会关闭该应用程序)。该示例可能永远持续下去,但这是问题的摘要:
menuShown()
ArrayIndexOutOfBounds
使用特定的异常类型更好吗?如果我错过了可能发生的X种异常之一的捕捉,该怎么办? 坦白说,在2-3年内,我只听说过Java标准异常的情况就占了10%。是的,有人说如果调用者不知道如何处理抛出的异常,那么他应该没有权利调用抛出方法。那正确吗?
我已经读过Anders Hejlsberg的这篇文章,说检查异常是不好的。在某些情况下,这是否应表明建议方便吞咽异常?
我知道这门课程是永恒的,但实际上我很期待根据您的建议回顾一个150个班级的中型项目。非常感谢。
那里是例外,因此Task的程序员不必自己解决问题。(1):如果问题对于他来说在任务中不合逻辑。从流中读取字符串的任务不是应该处理磁盘错误吗?但是,如果数据不包含字符串,则应该非常合乎逻辑。
(2):他无法自己处理(信息不足)一项任务,要从文件中读取字符串和未找到文件,可能会要求用户选择另一个文件,但是现在该任务如何才能将文件放在哪个文件夹中?文件的扩展名。在不知道的情况下,任务如何创建GUI来重新询问。
(3):没有逻辑(或可管理)的方式来区分不同的收益。如果任务无法读取文件并返回null。如果文件格式错误,也返回null怎么办?这两个有什么不同?可以使用例外来区别这一点。那就是为什么它被称为Exception :-D。
(4):有许多相似的任务需要类似的处理和编写,所有任务中都难以维护。编写用于所有访问的句柄代码可能会一团糟,因为您可能需要进行很多重复。
interface DBAccess { public Result accessDB(); } class DBOperation { static public void DoOperation(DBAccess pAccess) { try { return DBAccess.accessDB(); } catch(InvalidDBPasswordException IPE) { // Do anything about invalid password } catch(DBConnectionLostException DBCLE) { // Do anything about database connection lost } // Catch all possible DB problem } } ... private User[] ShowUserList_and_ReturnUsers() { // Find the used. // Show user list if (Users.count() == 0) return null; else return Users; // No need to handle DB connection problem here } private User[] GetUserProfile() { // Find the used and return // No need to handle DB connection problem here } ... /** An onClick event to show user list */ { DBOperation.DoOperation(new DBAccess() { public Result accessDB() { return ShowUserList_and_ReturnUsers(); } }); } /** An onClick event to show a user profile */ { DBOperation.DoOperation(new DBAccess() { public Result accessDB() { return GetUserProfile(); } }); } ... Many more DB access
(5):编写所有错误检查会使任务复杂或减慢速度。上面的问题应该表明它如何帮助减少并发症。这是不减慢速度的方法。
for(int i = 0; i < Users.length; i++) { User aUser = Users[i]; // Do something with user } Replaced with try { for(int i = 0; ; i++) { User aUser = Users[i]; // Do something with user } } catch(ArrayOutOfBoundException AOBE) {}
如果用户数量很多,替换代码将具有更好的性能。
当发生数据库错误时,应该返回一个空值,错误代码还是引发异常?答:取决于哪种错误。就像您找不到用户一样,这不是错误。但是,如果密码错误或连接断开,则这些错误就是尝试以常规方式处理该程序会使程序复杂化。
(1)。使用过多的try- catch()对性能有负面影响吗?回答:根据“有效Java”的说法,就我所记得的而言,它的作用非常小(仅在循环中效果不佳)(我现在没有这本书了)。
(2)。使用特定的异常类型更好吗?回答:针对特定用户最好避免解决错误的问题。
如果我错过了可能发生的X种异常类型之一怎么办?坦白说,我在2-3年内只听到并使用了10%的Java标准异常。回答:就像处理错误一样,您也可能会错过它。您只需在发现时将其添加即可。
是的,有人说如果调用方不知道如何处理引发的异常,那么他应该没有权利调用throwing方法。那正确吗?答:不,如果我不知道该怎么做,请重新抛出。
(3)。我读过Anders Hejlsberg的这篇文章,说检查异常是不好的。在某些情况下,这是否应表明建议方便吞咽异常?回答:我认为他正在谈论“检查异常”作为编译器的功能,以确保应处理某些异常。具有例外的想法。
(4)。一张图片价值1000字。.我想一些例子在这里会很有帮助。答:上面的代码。
我现在逃跑了....对不起… :-p(等一下,亲爱的!)