Nullsafe Long的价值

时间:2018-04-18 08:19:52

标签: java parsing numberformatexception java.lang

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

如果视图最初加载criteriaIdentifier可能为null,之后我根据JSF视图中的selectedItem设置值。

但是,Long.valueOf(criteriaIdentifier)会抛出NumberFormatException - 如果字符串无法解析为长整数(即null)。

我已经考虑默认将Id设置为默认-1,但我想知道是否有更好的练习。

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

5 个答案:

答案 0 :(得分:5)

您可以使用Apache commons中的NumberUtils。它是零安全的,您可以指定默认值。

示例:

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

以下是API:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/math/NumberUtils.html#toLong(java.lang.String,%20long)

答案 1 :(得分:2)

我假设criteriaIdentifier是一个String。 你可以用 org.apache.commons.lang3.math.NumberUtils.toLong(String, long)如果String参数为null,则为您提供默认值。 或者使用org.apache.commons.lang3.math.NumberUtils.toLong(String),如果String为null,则返回零。

答案 2 :(得分:2)

Long.valueOf(null)会抛出NumberFormatException,而不是NullPointerException

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

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

它有点冗长,但如果-1lcriteriaIdentifier,则允许您默认为null(不需要其他依赖项)。

API herehere

答案 3 :(得分:1)

这取决于您的情况,但通常有办法避免此类问题。

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

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

答案 4 :(得分:0)

当我们说nullSafe时,我们通常希望在传递null而不是null0或任何其他值时从api接收-1。 / p>

为此,请使用createLong的{​​{1}}静态方法。

警告*: 如果输入的字符串不是org.apache.commons.lang3.math.NumberUtils并且不是数字,则抛出NumberFormatException。

注意**:从3.1开始,它处理十六进制(0Xhhhh)和八进制(0ddd)表示法。 N.B.前导零表示八进制;不修剪空格。

示例:

null