想象一下以下场景
Long critId = Long.valueOf(criteriaIdentifier);
如果视图最初加载criteriaIdentifier
可能为null,之后我根据JSF视图中的selectedItem
设置值。
但是,Long.valueOf(criteriaIdentifier)
会抛出NumberFormatException
- 如果字符串无法解析为长整数(即null
)。
我已经考虑默认将Id设置为默认-1
,但我想知道是否有更好的练习。
PS:从技术上讲,criteriaIdentifier
不能为-1,因为这些值是使用序列生成器从数据库设置的,所以我应该知道-1是默认值并正确地执行默认操作
答案 0 :(得分:5)
您可以使用Apache commons中的NumberUtils
。它是零安全的,您可以指定默认值。
示例:
NumberUtils.toLong(null, 1L) = 1L
NumberUtils.toLong("", 1L) = 1L
NumberUtils.toLong("1", 0L) = 1L
答案 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")
)
它有点冗长,但如果-1l
为criteriaIdentifier
,则允许您默认为null
(不需要其他依赖项)。
答案 3 :(得分:1)
这取决于您的情况,但通常有办法避免此类问题。
通常将ID设置为-1是一种常见的做法,但我认为这不是一个好习惯。您知道-1在您的方案中不是可能的值,但只考虑类型Long它是一个有效值。因此,在代码中的任何地方,您都需要实现像id!=-1
这样的测试,这使得代码更难理解,并且null
值通常更适合该场景 - 没有值的Long对象。
如果我在接收ID的方法中并且如果我得到null则等待有效ID,那么我会抛出异常并让方法的调用者处理它。如果它是一个Web API(例如,为什么你会得到一个String?)那么你可以抛出一个HTTP错误。或者,如果您想处理错误的参数,那么最好返回null或使用null作为默认值。
答案 4 :(得分:0)
当我们说nullSafe时,我们通常希望在传递null
而不是null
或0
或任何其他值时从api接收-1
。 / p>
为此,请使用createLong
的{{1}}静态方法。
警告*:
如果输入的字符串不是org.apache.commons.lang3.math.NumberUtils
并且不是数字,则抛出NumberFormatException。
注意**:从3.1开始,它处理十六进制(0Xhhhh)和八进制(0ddd)表示法。 N.B.前导零表示八进制;不修剪空格。
示例:
null