7

想象以下场景 Long critId = Long.valueOf(criteriaIdentifier);

如果最初加载的视图criteriaIdentifier可能为空,则之后我根据selectedItemJSF 视图中的值设置该值。

但是,如果字符串不能被解析为 long(ie ) ,则Long.valueOf(criteriaIdentifier)抛出-。NumberFormatExceptionnull

我曾想过将 Id 默认设置为 default -1,但我想知道是否有更好的做法。

PS:技术上criteriaIdentifier不能是-1,因为这些值是从数据库中设置的,使用序列生成器,所以我应该知道 -1 是默认值并正确执行默认操作

4

5 回答 5

11

您可以使用NumberUtils来自 Apache Commons 的。它是 null 安全的,您可以选择指定默认值。

例子:

NumberUtils.toLong(null) = 0L
NumberUtils.toLong("")   = 0L
NumberUtils.toLong("1")  = 1L

NumberUtils.toLong(null, 1L) = 1L
NumberUtils.toLong("", 1L)   = 1L
NumberUtils.toLong("1", 0L)  = 1L

有关更多信息,请查看API

于 2018-04-18T08:24:27.690 回答
3

Long.valueOf(null)会扔NumberFormatException,不会NullPointerException

在 Java 8 中,您可以以声明方式为可空内联选择默认评估,例如

Long.valueOf(
    Optional.ofNullable(criteriaIdentifier).orElseGet(() -> "-1")
)

这有点冗长,但允许您默认为-1lif criteriaIdentifieris null(不需要额外的依赖项)。

API herehere

于 2018-04-18T08:26:45.833 回答
2

我假设条件标识符是一个字符串。您可以使用 org.apache.commons.lang3.math.NumberUtils.toLong(String, long)如果 String 参数为空,它会为您提供默认值。或者您使用org.apache.commons.lang3.math.NumberUtils.toLong(String)如果字符串为空则返回零。

于 2018-04-18T08:24:44.263 回答
2

当我们说 nullSafe 时,我们通常希望在通过它null时从 api接收 a null,而不是 a0-1或任何其他值。

为此,请createLong使用org.apache.commons.lang3.math.NumberUtils.

CAUSION*:如果输入字符串不是null并且不是数字,则会引发 NumberFormatException。

CAUSION**:从 3.1 开始,它处理十六进制 (0Xhhhh) 和八进制 (0ddd) 符号。NB 前导零表示八进制;不修剪空格。

样本:

NumberUtils.createLong(null) --> null
NumberUtils.createLong("1") --> 1
NumberUtils.createLong("hi") --> NumberFormatException
NumberUtils.createLong(" 11") --> NumberFormatException (does not trim)
NumberUtils.createLong("023") --> 19 (leading 0 means octal)
NumberUtils.createLong("0x23") --> 35 (leading 0x means hex)
于 2020-10-14T13:46:16.077 回答
1

这取决于您的情况,但通常有一些方法可以避免此类问题。

通常将 ID 设置为 -1 是一种常见做法,但我认为这不是一个好的做法。您知道 -1 在您的场景中不是可能的值,但仅考虑 Long 类型它是一个有效值。因此,在代码中的任何地方,您都需要实现测试,例如 ifid!=-1这会使代码更难理解,并且通常该null值更适合该场景 - 没有值的长对象。

如果由我决定,例如在接收 ID 并等待有效 ID 的方法中,如果我得到 null,我会抛出异常并让方法的调用者处理它。例如,如果它是一个 Web API(否则你为什么会得到一个字符串?)那么你可以抛出一个 HTTP 错误。或者,如果您想处理错误的参数,那么您最好返回 null 或使用 null 作为默认值。

于 2018-04-18T08:26:34.497 回答