ADDITIONAL SYSTEM INFORMATION :
Win 10 Pro
jdk 1.8_171 (x64)
A DESCRIPTION OF THE PROBLEM :
When ternary statement returns Boolean for true, and boolean for false.
Seems the type inference settles on boolean. Why not Boolean?
When the Boolean is null valued, it throws NPE.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
run the test in attached source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
output:
null
ACTUAL -
Runtime:
java.lang.NullPointerException
at Tests.test(Tests.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
---------- BEGIN SOURCE ----------
import org.junit.Test;
public class Tests {
@Test
public void test() throws Exception {
Boolean val = isTrue("true") ? isTrue(null) : false;
System.out.println(val);
}
public Boolean isTrue(String val) {
if (val == null)
return null;
return val.equalsIgnoreCase("true");
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Boolean val = isTrue("true") ? isTrue(null) : (Boolean) false;
FREQUENCY : always
Win 10 Pro
jdk 1.8_171 (x64)
A DESCRIPTION OF THE PROBLEM :
When ternary statement returns Boolean for true, and boolean for false.
Seems the type inference settles on boolean. Why not Boolean?
When the Boolean is null valued, it throws NPE.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
run the test in attached source code
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
output:
null
ACTUAL -
Runtime:
java.lang.NullPointerException
at Tests.test(Tests.java:6)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
---------- BEGIN SOURCE ----------
import org.junit.Test;
public class Tests {
@Test
public void test() throws Exception {
Boolean val = isTrue("true") ? isTrue(null) : false;
System.out.println(val);
}
public Boolean isTrue(String val) {
if (val == null)
return null;
return val.equalsIgnoreCase("true");
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Boolean val = isTrue("true") ? isTrue(null) : (Boolean) false;
FREQUENCY : always