实际上我试图改变特定字符串的空检查,以前是
{{#each controller as |item|}}
这不是检查字符串的正确方法,因为
{if (empName.equals("") || (empName.equals(null)))
//Do something
}
但它没有用。任何人都建议这有什么问题?
答案 0 :(得分:3)
我尝试更改特定字符串的空检查,以前是
if (empName.equals("") || (empName.equals(null)))
上面的代码有两个问题:
empName
为null
,则会出现例外情况empName.equals(null)
需要返回false
,因此无效检查字符串是null
还是空格的正确方法如下:
if (empName==null || empName.trim().isEmpty())
您不需要== true
部分,因为isEmpty()
会返回boolean
。
答案 1 :(得分:2)
这里有一些基本的想法很方便。这些是:
指针解除引用
短路评估
指针解除引用。 在Java中,非原始类型称为引用类型。这些类型的变量不包含类型的值,而是包含指向内存的指针。例如:
String str;
String是引用类型。初始化后,变量str
将保存指向已分配的String实例的内存位置的引用或指针。在初始化之前,引用类型的变量具有值null
。
在可以访问和使用类实例的任何成员(例如,方法或字段)之前,必须访问引用类型的指针以获取成员在内存中的位置。这称为解除引用。如果引用类型变量包含null
值,则无法访问任何成员。这就是为什么像这样的表达式是危险的:
`if (myString.equals("")) ...`
如果变量myString
包含null
或未初始化,则无法将其解除引用到堆位置。在这种情况下,会引发异常并且您的程序失败。
如果您无法保证String
变量不会包含null
,那么您不应使用上述语句,因为它可能会在您的代码中引发NullPointerException
。
短路评估。 短路评估是在评估所有部件之前终止多部分表达式的评估的地方 - 因为完成整个评估不会改变表达式的值。这通常适用于布尔表达式。
考虑这样的表达式:
if (myString.trim().isEmpty()) { ... }
如上所述,只要myString包含NullPointerExpressions
且无法解除引用,该表达式就会使程序容易受null
攻击。不过这个表达是安全的:
if (myString == null || myString.trim().isEmpty) { ... }
在上述情况下,即使myString包含NullPointerException
,此表达式也永远不会抛出null
。如果myString等于null
,则表达式的第一部分为true
。在布尔OR表达式true OR xx
中,无论xx
是什么,表达式的结果始终为true。因此,Java环境只执行第一部分而不是第二部分。这是一件好事,因为如果它已经出现NullPointerException。
短路评估通常用于Java if-then
表达式,以测试会在逻辑表达式的后续部分引发异常的空条件。