Java 避免检查异常
首先,我强烈认为,术语“已检查”与“未检查的例外”是不精确的,因为这会误导进行检查的人或检查是否是自愿的。因此,我将在这个问题中使用以下术语,以便不了解差异的人可以插嘴回答:Java 避免检查异常,java,exception,Java,Exception,首先,我强烈认为,术语“已检查”与“未检查的例外”是不精确的,因为这会误导进行检查的人或检查是否是自愿的。因此,我将在这个问题中使用以下术语,以便不了解差异的人可以插嘴回答: 检查强制异常=检查异常 检查未强制执行的异常=未检查的异常 问题动机: 我觉得标准Java实用程序的编写者对异常的过度依赖是错误的和不恰当的。我特别关注的实用程序是Integer.parseint(String)实用程序方法 它不应该使用check not强制异常,因为使用util的每个人都知道提供的字符串通常是未知的
- 检查强制异常=检查异常
- 检查未强制执行的异常=未检查的异常
我觉得标准Java实用程序的编写者对异常的过度依赖是错误的和不恰当的。我特别关注的实用程序是Integer.parseint(String)实用程序方法
如果我要重写这个实用程序,以满足我对实用程序编写者过度使用异常的烦恼,那么解决这个困境的最佳方法是什么?这将处理不可接受的字符串,但满足我反对过度使用异常的思想 我解决这个问题的直接想法是
- 整数解析(字符串、委托)
- 整数解析(字符串值,CallBack unacceptedParseCallback)李>
公共接口回调{
T(S值);
}
- 回调可以为null,但只有在需要但未提供回调缓解时才会引发NumberFormatException
然而,我怀疑我的快速而肮脏的解决方案是避免使用异常的最佳方法。对于过度依赖异常的思想分歧,我可以使用哪些替代算法来解决?在我开始编写此类实用程序库之前。您正在寻找的是Maybe monad,它在Java8中实现为
可选接口。这是一种经过战斗验证的方法,有助于在合成链中的任何位置(如果可能的话)面对“异常”合成函数
上面提到的一个警告是,完整的API必须支持Maybe monad,才能使其真正有用。检查的异常是由于程序员无法触及而发生的异常。一个完美的例子向你展示了他们是多么有用,那就是通过网络发出请求。在C#(不存在选中的异常)中,当您使用HttpClient.Get
发出请求时,它现在可能工作正常,但两分钟后再次使用它可能会发生意外的网络错误,对此您无能为力。因此,如果您是一名优秀的程序员,您应该随时准备好处理那些意外的网络错误,方法是使用catch
包装调用。C#不强制执行这一点,Java强制执行,Java强制你成为一个负责任的程序员。
在Integer.parseInt
的情况下,这不应强制您捕获错误,因为可能发生的任何错误都不是意外的。您只需查看正在传递的字符串
,就可以确定呼叫是否中断。如果我作为一名程序员,知道我将始终传递一个有效的字符串
,那么我真的应该在其中放置一个捕获
,我知道它永远不会被使用吗?checked=编译器检查,unchecked=编译器未检查。顺便说一句,Throwable的其他子类也被检查过了。我喜欢有坚决批评的人,因此:已经切换到Java8了(您的代理喜欢this::toString
)。虽然C++已经有了一种异常,但是java应用了它们。从历史上看,它避免了继续错误结果并允许异常捷径。继续思考最佳操控。如果你读过的话,C#的方法实际上是问题的解决方案,而不是解决方案的问题。@BlessedGeek这只是一个观点。详细说明它试图解决的问题以及它是如何解决的。人们普遍认为,对正常运行的代码使用异常是一种不好的做法。@Blessedgek也普遍认为,让程序因简单的网络错误而崩溃是一种不好的做法。
public interface CallBack<T,S> {
T mitigate(S value);
}