In this code.
public class Test {
public static void testFun(String str) {
if (str == null | str.length() == 0) {
System.out.print
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.