In this code.
public class Test {
public static void testFun(String str) {
if (str == null | str.length() == 0) {
System.out.print
You can use StringUtils
:
import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(str)) {
System.out.println("String is empty");
} else {
System.out.println("String is not empty");
}
Have a look here also: StringUtils.isBlank() vs String.isEmpty()
isBlank
examples:
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false
The problem here is that in your code the program is calling 'null.length()' which is not defined if the argument passed to the function is null. That's why the exception is thrown.
The | and & check both the sides everytime.
if (str == null | str.length() == 0)
here we have high possibility to get NullPointerException
Logical || and && check the right hand side only if necessary.
but with logical operator
no chance to get NPE because it will not check RHS
Change Below line
if (str == null | str.length() == 0) {
into
if (str == null || str.isEmpty()) {
now your code will run corectlly. Make sure str.isEmpty()
comes after str == null
because calling isEmpty()
on null will cause NullPointerException
. Because of Java uses Short-circuit evaluation when str == null
is true it will not evaluate str.isEmpty()
The problem is that you are using the bitwise or operator: |
. If you use the logical or operator, ||
, your code will work fine.
See also:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Difference between & and && in Java?
The edit shows exactly the difference between code that works and code that doesn't.
This check always evaluates both of the conditions, throwing an exception if str
is null:
if (str == null | str.length() == 0) {
Whereas this (using ||
instead of |
) is short-circuiting - if the first condition evaluates to true
, the second is not evaluated.
See section 15.24 of the JLS for a description of ||
, and section 15.22.2 for binary |
. The intro to section 15.24 is the important bit though:
The conditional-or operator || operator is like | (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is false.