Monthly Archives: November 2015

Why is “boolean val = (0 == 0 ? null : true)” causing a Java NullPointerException ?

This would be a funny interview question : why is the following Java code compiling but throwing a NullPointerException at runtime ?

boolean val = (0 == 0 ? null : true);

Since boolean is a primitive data type, it can’t be initialized with a null value. As a matter of fact, the compiler rejects the following code :

boolean val = null;

So, one would expect the conditional/ternary operator assignement to also fail at compile time, whether because null can’t be assigned to a boolean, or because null and true don’t have the same data type, which is not allowed by the ternary operator.
That’s not the case, compilation runs fine, only at runtime do you get a NullPointerException.
Why ?

I guess this comes from Java autoboxing/autounboxing feature. Since the “then” and “else” parts of the operator must have the same type, Java autoboxes true to Boolean.TRUE, and assumes null is a Boolean. Knowing that Boolean can be autounboxed to boolean, the compiler will accept the statement.

Then, at runtime, null will be autoboxed to boolean, eventually causing the NullPointerException. Et voilĂ  !

C++ builder EAccessViolation when calling Variant.OlePropertySet() for Excel Automation

After migrating an application from C++ Builder 4 to C++builder 6, the excel COM automation started to crash with error EAccessViolation at address 00000800 when calling the Variant.OlePropertySet(), OlePropertyGet() or OleFunction() methods, as in the following code :

        Variant xlApp = Variant::CreateObject("Excel.Application");
        xlApp.OlePropertySet("Visible", true); // causes the EAccessViolation
        Variant workbooks = xlApp.OlePropertyGet("Workbooks");
        Variant currentWorkbook ClasseurCourant = workbooks.OleFunction("Open", L"C:\\MyExcelFile.xls");

Excel-OlePropertySet-EAccessViolation
This code was working fine with Builder 4, it was also working fine when used in a brand new application, but it always crashed in the converted app. Given that many developers reported the same error, with no known fix, and that one couldn’t expect support for a 12 years old IDE, I eventually fixed the issue by bypassing the Borland Wrappers and using directly COM.
Continue reading