首页 > 编程知识 正文

简述java中异常处理的机制,java输入错误数字重新输入

时间:2023-05-06 04:03:26 阅读:164809 作者:3775

原文| dzone.com/articles/9-…

作者| Thorben Janssen

翻译

无论是初学者还是经验丰富的开发人员,对你和你的团队来说,提高异常处理能力能更好地解决问题。

用Java处理异常不是一件简单的事情,初学者可能会觉得很难理解。 即使是经验丰富的开发人员,也可能需要几个小时来考虑应该如何抛出或处理哪些异常。

因此,大多数开发团队在如何使用它们方面都有自己的规则。 刚加入团队的人可能会惊讶于这些规则与以前使用的规则有多么不同。

尽管如此,仍有一些最佳实践在许多团队中使用。 以下9个最重要的方法可以帮助你开始或提高异常处理。

1、使用finally代码块清理资源或使用try-with-resource语句

经常在try代码块中使用InputStream等资源。 稍后需要关闭。 在这种情况下,一个常见的错误是在try块的末尾关闭资源。

问题是,只要不抛出异常,这种方式就能很好地工作。 执行try代码块中的语句,并关闭资源。

但你添加try代码块是有原因的。 调用可能抛出一个或多个异常的方法,或者自己抛出异常。 这意味着它可能没有到达try代码块的末尾,最终无法关闭资源。

因此,必须将所有清理代码放入finally代码块中,或者使用try-with-resource语句。

使用finally代码块

与try代码块的最后几行不同,finally代码块总是执行。 在成功执行try代码块或通过catch代码块处理异常之后,会发生这种情况。 因此,可以确保清理所有打开的资源。

Java7的Try-With-Resource语句

另一种方法是try-with-resource语句,它在介绍Java异常处理的语句中有更详细的描述。

如果你的资源实现了AutoCloseable界面,你就可以使用它。 大多数Java标准资源都是这样做的。 在try子句中打开资源时,dddpd会在执行try代码块或出现异常后自动关闭。

2、优先考虑具体异常

抛出的异常越具体越好。 请记住,不知道你代码的同事,或者几个月后的你,需要调用你的方法处理异常。

因此,确保向他们提供尽可能多的信息。 这使得API更容易理解。 最终,方法的调用方可以更好地处理异常,也可以通过附加检查避免异常。

因此,请始终尝试找到最适合你的异常事件类。 例如,抛出NumberFormatException而不是IllegalArgumentException。 避免抛出不具体的异常。

3 .制定指定例外的文档

无论何时为方法签名指定异常,都必须在Javadoc中创建文档。 这与以前的最佳做法有着相同的目标。 向调用者提供尽可能多的信息,以便可以避免或处理异常。

因此,请在你的Javadoc中添加@throws声明,描述可能引起异常的情况。

4、抛出包含说明性消息的异常

这个最佳实践背后的思想与以前的两个相似,不同的是不需要向方法的调用者提供信息。 需要知道日志文件和监视工具中记录的异常信息的所有人都可以读取该异常信息。

因此,必须尽可能准确地描述问题,提供最相关的信息以了解异常情况。

请不要误会。 应该用1-2的短文说明异常的原因,而不是写文本段落。 这使运输团队更容易了解问题的严重性,并分析任何服务事件。

如果抛出特定异常,则该类名最有可能描述错误的类型。 因此,没有必要提供很多额外的信息。 NumberFormatException就是一个很好的例子。 如果dddpd提供了错误的字符串格式,java.lang.Long类的构造方法将抛出NumberFormatException异常。

NumberFormatException类的名称告诉了问题的类型。 的信息只是提供导致问题的输入字符串。 如果异常类的名称不太具有表达能力,则必须在消息中提供所需的信息。

17:17:26,386 errortestexceptionhandling :52-Java.lang.numberformatexception : for input string 3360 ' XYZ '

译者注:你可以看到给班级起个好名字是多么重要。

5、优先捕获最具体异常

大多数IDE都有助于实现这一最佳做法。 当dddpd尝试捕获不太具体的异常时,它会报告无法到达的代码块。

问题是,只有第一个与异常匹配的catch代码块才会运行。 所以,如果首先捕获IllegalArgumentEx

ception 异常,你将不能到达应该处理更具体的 NumberFormatException 异常的 catch 代码块。因为它是 IllegalArgumentException 类的子类。

总是首先捕获最具体的异常,然后将不太具体的 catch 代码块添加到列表的尾部。

在下面的代码片段中,你可以看到 try-catch 语句的例子,第一个 catch 代码块处理所有 NumberFormatException 异常,并且第二个 catch 代码块处理所有不属于 NumberFormatException 的 IllegalArgumentException 异常。

6、不要捕获 Throwable

Throwable 是所有 Exception 和 Error 类的父类。你可以在 catch 语句中使用它,但是你绝对不要这样做!

如果你在 catch 语句中使用 Throwable,它不仅捕获所有的 Exception,还将捕获所有的 Error。

Error 是被 JVM 抛出的,它表示不能被应用程序处理的严重问题。典型的例子是 OutOfMemoryError 或 StackOverflowError,都是由应用程序无法控制的情况引起的,并且无法处理。

因此,最好不要捕获 Throwable,除非你绝对确信自己处于能够或需要处理错误的特殊情况下。

7、不要忽略异常

你是否曾经分析过一个bug报告,其中只执行了用例的第一部分?

这通常是由忽略异常引起的,开发者可能很确信它从不会抛出,并且添加了不处理或不打印日志的 catch 代码块,dddpd找到这个代码块的时候,你甚至可能发现一个著名的注释“This will never happen”。

好吧,你可能正在分析一个不可能发生的问题。

因此,请不要忽略异常。你不知道代码在未来将如何被改变。有人可能会删除阻止异常事件的验证,而没有意识到这会造成问题。或抛出异常的代码被更改,现在抛出同一个类的多个异常,并且调用代码并不能阻止所有这些异常。

你至少应该写一条日志信息,告诉每个人意想不到的事情刚刚发生了,需要有人来检查它。

8、不要打印日志的同时抛出异常

这可能是列表中最经常被忽略的最佳实践。你可以在许多代码段甚至库中发现异常被捕获、打印日志、并重新抛出。

记录发生的异常,然后将其重新抛出,以便调用者可以适当的处理它,这可能会很直观。但是它将为同一异常写入多个错误信息。

17:44:28,945 ERROR TestExceptionHandling:65 - java.lang.NumberFormatException: For input string: "xyz"Exception in thread "main" java.lang.NumberFormatException: For input string: "xyz"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

at java.lang.Long.parseLong(Long.java:589)

at java.lang.Long.(Long.java:965)

at com.stackify.example.TestExceptionHandling.logAndThrowException(TestExceptionHandling.java:63)

at com.stackify.example.TestExceptionHandling.main(TestExceptionHandling.java:58)

额外的消息也没有增加任何信息。正如最佳实践4中所述,异常信息应该描述异常事件。堆栈跟踪会告诉你在哪个类,方法和行中引发了异常。

如果你需要增加额外的信息,你应该捕获异常并且将其包装在自定义异常中,但是请确保遵循最佳实践9。

9、包装异常而不使用它

有时最好是捕获一个异常并将其包装到自定义异常中。这样异常的典型例子是应用程序或框架的具体业务异常。这使你可以增加额外的信息,并且还可以对异常类实现特殊处理。

dddpd这样做的时候,确保将原始异常设置为原因(cause)。Exception 类提供了接收 Throwable 参数的具体构造方法。否则,你会丢失堆栈跟踪和原始异常的信息,这将使分析导致异常的事件变得困难。

总结

如你所见,dddpd抛出或捕获异常的时候,你应该考虑很多不同的事情。它们中大多数的目标是提高代码的可读性或API的可用性。

异常通常是一种错误处理机制,同时也是一种通信机制。因此,你应该确保与你的同事讨论你想要应用的最佳实践和规则,以便每个人都理解一般的概念,并以相同的方式使用它们。

作者:Geek_ymv

链接:https://juejin.cn/post/6909838417278959630

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。