Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java异常处理和性能的成本_Java_Performance_Exception - Fatal编程技术网

Java异常处理和性能的成本

Java异常处理和性能的成本,java,performance,exception,Java,Performance,Exception,以下代码将引发异常“字符串索引超出范围:-1”。 从Java性能的角度来看,检查索引是否大于-1还是让代码抛出异常更好?让框架来处理日志记录 String abc = "somedata"; if (abc != null) { int index = abc.lastIndexOf(','); abc = abc.substring(0, index); } =编辑=我想我将总结讨论/观点 我的一些开发人员朋友对此进行了一场小辩论。我尊重这两种观点,如下所述 **开发人员不担

以下代码将引发异常“字符串索引超出范围:-1”。 从Java性能的角度来看,检查索引是否大于-1还是让代码抛出异常更好?让框架来处理日志记录

String abc = "somedata";
if (abc != null) {
    int index = abc.lastIndexOf(',');
    abc = abc.substring(0, index);
}
=编辑=我想我将总结讨论/观点

我的一些开发人员朋友对此进行了一场小辩论。我尊重这两种观点,如下所述

**开发人员不担心“字符串索引超出范围:-1”背后的想法** 合法用户将提交正确的数据并获得正确的结果。 黑客/脚本编写者/非合法使用发布无效数据的应用程序可能会在UI中看到一个损坏的页面,但我最不关心的是。 我让系统抛出异常,让框架捕获并记录它。 让它被记录的好处告诉我有脚本编写者滥用我的系统

**我的看法** 在知道有脚本编写者/黑客试图滥用我的系统后,那又怎样? 在IMO,关于任何重要的网络知名系统,大多数都会定期收到黑客系统每天大量的脚本请求。 不需要有效期或证明。识别和阻止它们是WAF系统的工作,而不是我记录数千个日志的代码 每天都有很多例外,告诉你有黑客

我同意mvd的回答,即不要扔球/接球/记录。 我们必须决定在发布无效数据时要做什么,要么导致不愉快的业务流,要么是我不关心的完全有缺陷的请求。 如果我在乎,则执行备用业务流场景,如果我不在乎,则忽略并记录一条警告,无需抛出/catch/throw/catch/log等

同样,这是有争议的,决策可能取决于具体情况


感谢大家的回复。

我不能谈论性能成本,但我要说的是,最好不要使用异常来驱动应用程序逻辑

例外就是例外。如果您可以用代码编程并解释您的推理,那么这比使用异常要好

public String substringOnComma(String value) {
    String abc = "";

    if (value != null) {
        if (containsComma(value) {
            int index = value.lastIndexOf(',');
            abc = value.substring(0, index);
        }
    }

    return abc;
}


public boolean containsComma(String value) {
    boolean comma = false;

    if (value.lastIndexOf(',') != -1) {
        comma = true;
    }

    return comma;
}

出于性能和可维护性的原因,最好是检查值,而不是捕获异常。检查值是否为-1是现代CPU的一条指令,根据方法的不同,引发和捕获异常的次数可能会有数百次。

这取决于具体情况。如果经常出界,检查速度会快得多。如果这种情况很少发生,那么捕获异常的速度会更快。然而,差异将是如此之小,以至于您可能应该使用任何导致更好代码的方法。这完全取决于在发生错误的情况下业务逻辑所指示的情况。如果这是作为处理的一部分处理的预期条件,那么您可能应该测试它。如果它不正常,应该终止业务逻辑,您可能希望让它抛出并在错误处理代码中处理它。如果没有更多的上下文,你就不可能得到更细致的答案。这完全取决于您的需求,因为您没有给出上下文,所以您的问题是离题的。如果
实际上包含一个
,该代码是否会重复工作?是的,我认为您是正确的。有不同的方法来执行这种类型的代码,不会导致重复的代码。我的只是一个现成的例子。