Java 为什么使用错误代码(如-1)比使用异常效率低?

Java 为什么使用错误代码(如-1)比使用异常效率低?,java,exception,Java,Exception,在JLS8的例外章节中,我看到: throw语句的显式使用为 通过返回数据来处理错误条件的老式方式 值,例如不使用负值的整数值-1 这通常是意料之中的。经验表明,这种做法太过滑稽 调用者忽略或不检查值,导致程序失败 不健壮、表现出不良行为或两者兼而有之 实际上,我不清楚以下两个问题: 1,例如整数值-1,其中通常不会出现负值,为什么通常不会出现负值?据我所知,我们经常使用返回值-1表示错误、异常事件,。。。或者一些不好的东西 2经验表明,调用方经常忽略或不检查这些有趣的值,导致程序不健壮,表现出

在JLS8的例外章节中,我看到:

throw语句的显式使用为 通过返回数据来处理错误条件的老式方式 值,例如不使用负值的整数值-1 这通常是意料之中的。经验表明,这种做法太过滑稽 调用者忽略或不检查值,导致程序失败 不健壮、表现出不良行为或两者兼而有之

实际上,我不清楚以下两个问题:

1,例如整数值-1,其中通常不会出现负值,为什么通常不会出现负值?据我所知,我们经常使用返回值-1表示错误、异常事件,。。。或者一些不好的东西

2经验表明,调用方经常忽略或不检查这些有趣的值,导致程序不健壮,表现出不良行为,或两者兼而有之。。调用者忽略或不检查哪些有趣的值,导致程序不健壮、表现出不良行为,或者两者兼而有之?我不理解这个问题…请帮助我澄清,如果是,请给我一个例子来说明


非常感谢

一个常见的例子是:人们没有检查字符串的内容,而是盲目地调用indexOf-并且没有考虑到搜索的内容不在该字符串中,因此返回的结果是-1

至少在使用checked异常时,程序员必须对其代码正在使用的某些代码引发的潜在异常采取措施。对于返回值,您可以完全忽略它们-因此稍微容易一点

另一方面,许多人认为检查异常的想法没有实现其承诺,因此提倡使用未检查异常。或者,正如谷歌等公司提议的那样:使用更复杂的返回值类

长话短说:

根据语言的性质,异常应被视为传达严重异常情况的主要手段 但这并不意味着使用数字返回码是不可能的,或者完全不被鼓励。 当方法返回int时,调用方必须检查它是否是错误代码。但如果这里没有预期的返回值范围,如何指定错误信号值

让我们说一下parseInt方法应该返回什么错误代码

如果调用方忘记检查返回值,错误可能会被忽略

但是,如果声明了异常,调用方必须检查并处理它,方法是捕获它或在抛出中声明i

1,例如整数值-1,其中通常不会出现负值,为什么通常不会出现负值

事实证明,人们并不总是检查返回值

据我所知,我们经常使用返回值-1表示错误、异常事件,。。。或者一些不好的东西

对。例外情况提供了另一种选择

调用方忽略或未检查哪些有趣的值

“有趣的值”,例如-1。这里每天每小时都会张贴一些例子

导致程序不健壮、表现出不受欢迎的行为,或者两者兼而有之

这意味着忽略“有趣的价值观”的程序不健壮或表现出不受欢迎的行为。。。并在这个网站上引发一些琐碎的问题

我不理解这个问题…请帮助我澄清,如果是,请给我一个例子来演示

尝试数百个例子

请帮助我澄清,如果是,请举例说明:

例如,Class.getResourceAsStreamString如果找不到资源,则返回null,而不是引发异常。javadocs中清楚地记录了这一点

但是,许多人不阅读文档,也不检查getResourceAsStream调用的结果。因此,当资源丢失时,它们使用null并获得意外的NullPointerException

另一个常见示例是ServletRequest.getParameterString

如果您分析StackOverflow上的NPE Q,您会发现其中很大一部分是由于人们没有检查上述两种方法的结果造成的。如果你不相信我,这些原始问题可供你分析

为什么使用错误代码(如-1)比使用异常效率低

你引用的文本没有这样说。这可能不是真的。事实上,在许多情况下,使用错误代码通常效率更高。然而,随着最近JIT编译器的改进,对于典型用例,异常和异常处理的开销已经显著减少

总结:

人们是懒惰的。但是你知道! 人们很粗心。但是你知道! 阿皮萨 t要求人们检查返回值的健壮性不如抛出已检查异常的那些。。。因为人们编写的代码不检查返回代码。为什么?因为人们懒惰、粗心或两者兼而有之! 诚然,不抛出例外是有实际理由的。然而,这是健壮性与效率与迫使程序员处理已检查异常之间的权衡

您引用的文本并不是要告诉您总是使用异常。相反,它解释了异常是Java语言一部分的原因


你可能不同意,但是。。。坦白地说这不是一个值得争论的话题。检查/取消检查的异常等都很难在Java语言中进行修改。

您的标题提到了效率,但您的问题没有提到。事实上,使用异常并不有效。使用异常会迫使编码人员对错误采取措施,只需返回负数即可使代码继续。比较int age=输入YourAGE;返回-1而不是enterYourAge如果输入错误,则抛出异常当然,我们现在有可选的异常或特殊值,如-1,假设只有一个可能的特殊返回。@ajb Optional不是异常的可选,这是返回null的另一种选择,当然可以将其视为一个特殊值,但不是特别特殊的意义。@Kayaman我认为这是返回其他特殊值的另一种选择。特别是,在回答中提到了indexOf,如果存在Optional,那么最好返回一个Optional,而不是一个带有特殊值-1的整数,以指示notfound这是一个容易出错的值。但是,是的,它实际上并不等同于一个异常。嗨@GhostCat,如果在我返回错误代码例如-1之前,我检查了条件,比如if _myString{return-1}……那么,在这种情况下,检查了我的有趣值吗?还是被忽略?我们说的是收到-1的客户?!我不明白你的问题,上次我查了979个例子。毫无疑问,你得到了一个不同的结果?嗨@Stephen C,如果在我返回错误代码例如-1之前,我检查了类似于if _myString_=={return-1}的条件…那么,在这种情况下,检查了我的有趣值吗?还是被忽略?你没有抓住重点。在调用此方法的代码中是否检查返回代码。谢谢@Stephen C,我可以概括一下您的想法1。当我们使用返回代码=错误代码时,如-1,。。。在我们的程序中标记一些不好的东西=>好的,看起来不错。但是,当我们忽略它或不检查它时=>可能是因为我们懒惰或粗心,按照您的想法,程序可能会执行得不好=不健壮或表现出不良行为,…因此,使用错误代码似乎不是一个好的选择。2.因此,我们使用异常和异常处理来解决这个问题,因为它保证了一致性、可移植性和健壮性。虽然我从未用过“一致性”这个词,我也不知道你的意思。