Java 避免检查异常

Java 避免检查异常,java,exception,Java,Exception,首先,我强烈认为,术语“已检查”与“未检查的例外”是不精确的,因为这会误导进行检查的人或检查是否是自愿的。因此,我将在这个问题中使用以下术语,以便不了解差异的人可以插嘴回答: 检查强制异常=检查异常 检查未强制执行的异常=未检查的异常 问题动机: 我觉得标准Java实用程序的编写者对异常的过度依赖是错误的和不恰当的。我特别关注的实用程序是Integer.parseint(String)实用程序方法 它不应该使用check not强制异常,因为使用util的每个人都知道提供的字符串通常是未知的

首先,我强烈认为,术语“已检查”与“未检查的例外”是不精确的,因为这会误导进行检查的人或检查是否是自愿的。因此,我将在这个问题中使用以下术语,以便不了解差异的人可以插嘴回答:

  • 检查强制异常=检查异常
  • 检查未强制执行的异常=未检查的异常
问题动机
我觉得标准Java实用程序的编写者对异常的过度依赖是错误的和不恰当的。我特别关注的实用程序是Integer.parseint(String)实用程序方法

  • 它不应该使用check not强制异常,因为使用util的每个人都知道提供的字符串通常是未知的,因此,我们无论如何都会强制使用try块。因此,这不是一个无法挽救的局面
  • 如果实用程序的编写者强制使用check强制异常,这仍然是不合适的,因为您知道异常的可能性很高,所以不要将其作为异常。因为通过逻辑推理,你所期望发生的事情在语言学上不能被称为“例外”
  • 保留对实际关键问题的任何异常的使用
  • 问题
    如果我要重写这个实用程序,以满足我对实用程序编写者过度使用异常的烦恼,那么解决这个困境的最佳方法是什么?这将处理不可接受的字符串,但满足我反对过度使用异常的思想

    我解决这个问题的直接想法是

    • 整数解析(字符串、委托)
    由于Java语言中缺少代理,所以Java变得衰弱/贫瘠,因此我将它作为

    • 整数解析(字符串值,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);
    }