这个问题几乎被“回答得死去活来”,但我认为还有几点可以有用地提出:
1 - 最新版本的 Java 中的 JIT 可以优化异常处理,以在某些情况下大幅降低开销。但是,默认情况下不启用这些优化。
您编写示例的方式也存在问题:
-
捕获是非常糟糕的做法,因为您有可能意外捕获其他未经检查的异常。例如,如果你在打电话给你的时候这样做,你也会抓住潜在的......并隐藏错误。Exception
raw.substring(1)
StringIndexOutOfBoundsException
-
您的示例试图做的(可能)是处理字符串时实践不佳的结果。作为一般原则,您应该尝试尽量减少字符串的使用,并尝试限制它们的(有意)传播。如果可能,请使用空字符串而不是表示“无值”。当您确实需要传递或返回字符串时,请在方法javadocs中清楚地记录它。如果你的方法被调用与 a 当它们不应该 ...这是一个错误。让它引发异常。不要试图通过(在此示例中)返回 来补偿错误。null
null
null
null
null
null
我的问题更笼统,而不仅仅是价值观。null
...我的答案中的大多数观点都不是关于价值观的!null
但请记住,在许多情况下,您希望允许偶尔的 null 值或任何其他可能产生异常的值,而忽略它们。例如,当从某个地方读取键/对值并将其传递给像上面的tryTrim()这样的方法时,就是这种情况。
是的,在某些情况下,值是预期的,您需要处理它们。null
但我认为,正在做的事情(通常)是错误的处理方式。比较以下三位代码:tryTrim()
null
// Version 1
String param = httpRequest.getParameter("foo");
String trimmed = tryTrim(param);
if (trimmed == null) {
// deal with case of 'foo' parameter absent
} else {
// deal with case of 'foo' parameter present
}
// Version 2
String param = httpRequest.getParameter("foo");
if (param == null) {
// deal with case of 'foo' parameter absent
} else {
String trimmed = param.trim();
// deal with case of 'foo' parameter present
}
// Version 3
String param = httpRequest.getParameter("foo");
if (param == null) {
// treat missing and empty parameters the same
param = "";
}
String trimmed = param.trim();
最终,您必须处理与常规字符串不同的问题,并且通常最好尽快执行此操作。允许从其点原点传播得越远,程序员就越有可能忘记某个值是一种可能性,并编写假定非空值的错误代码。忘记HTTP请求参数可能丢失(即)是发生这种情况的经典情况。null
null
null
param == null
我并不是说这本质上是坏事。但是,您觉得需要编写这样的方法这一事实可能表明 null 处理不太理想。tryTrim()
最后,还有其他方法可以对API中的“没有值”进行建模。这些包括:
- 在 setter 和构造函数中测试意外情况,并引发异常或替换其他值。
null
- 添加方法...如果结果为 .,则引发异常。
is<Field>Set
get<Field>
null
- 使用空对象模式。
- 使用空字符串、空集合、零长度数组等代替字符串、集合或数组1。
null
- 用。
Optional
1 - 请注意,这与 Null 对象模式不同,因为不一定只有一个类型的实例来表示“nullity”。但是您可以将这两个想法结合起来...如果你对此有纪律。