{"record":{"id":"838af68790add9c9","repo":"java-native-access/jna","slug":"must-be-set-from-bool-bool","errorCode":null,"errorMessage":" must be set from BOOL/BOOL[]","messagePattern":" must be set from BOOL/BOOL\\[\\]","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"contrib/platform/src/com/sun/jna/platform/win32/Winevt.java","lineNumber":316,"sourceCode":"                            throw new IllegalArgumentException(type.name() + \" must be set from String/String[]\");\n                        }\n                        break;\n                    case EvtVarTypeBoolean:\n                        if (value.getClass().isArray() && value.getClass().getComponentType() == BOOL.class) {\n                            Type = type.ordinal() | EVT_VARIANT_TYPE_ARRAY;\n                            Memory mem = new Memory(((BOOL[]) value).length * 4);\n                            for (int i = 0; i < ((BOOL[]) value).length; i++) {\n                                mem.setInt(i * 4, ((BOOL[]) value)[i].intValue());\n                            }\n                            holder = mem;\n                            Count = 0;\n                            field1.writeField(\"pointerValue\", mem);\n                        } else if (value.getClass() == BOOL.class) {\n                            Type = type.ordinal();\n                            Count = 0;\n                            field1.writeField(\"intValue\", ((BOOL) value).intValue());\n                        } else {\n                            throw new IllegalArgumentException(type.name() + \" must be set from BOOL/BOOL[]\");\n                        }\n                        break;\n                    case EvtVarTypeString:\n                    case EvtVarTypeEvtXml:\n                        if (value.getClass().isArray() && value.getClass().getComponentType() == String.class) {\n                            Type = type.ordinal() | EVT_VARIANT_TYPE_ARRAY;\n                            StringArray sa = new StringArray((String[]) value, true);\n                            holder = sa;\n                            Count = ((String[]) value).length;\n                            field1.writeField(\"pointerValue\", sa);\n                        } else if (value.getClass() == String.class) {\n                            Type = type.ordinal();\n                            Memory mem = new Memory((((String) value).length() + 1) * 2);\n                            mem.setWideString(0, (String) value);\n                            holder = mem;\n                            Count = 0;\n                            field1.writeField(\"pointerValue\", mem);\n                        } else {","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/contrib/platform/src/com/sun/jna/platform/win32/Winevt.java#L298-L334","documentation":"For EvtVarTypeBoolean, setValue only accepts a BOOL (single value, stored via intValue) or a BOOL[] (stored as an array in native memory). Any other object — Java Boolean, boolean[], int, etc. — triggers this IllegalArgumentException naming the variant type.","triggerScenarios":"setValue(EVT_VARIANT_TYPE.EvtVarTypeBoolean, Boolean.TRUE) or setValue(..., new boolean[]{true}) — the JNA wrapper demands its own com.sun.jna.platform.win32.BOOL wrapper type, not java.lang.Boolean or primitive boolean[].","commonSituations":"Passing Java's Boolean/boolean[] directly because the developer assumed auto-boxing support; constructing event values from JSON where booleans deserialize to java.lang.Boolean.","solutions":["Wrap the value: new BOOL(true) for a single value","Convert arrays element-wise: BOOL[] arr = Arrays.stream(booleans).mapToObj(b -> new BOOL(b)).toArray(BOOL[]::new); or a loop for boolean[]","If the value is java.lang.Boolean, call bool.booleanValue() first and wrap in BOOL"],"exampleFix":"// before\nvariant.setValue(EVT_VARIANT_TYPE.EvtVarTypeBoolean, true);\n// after\nvariant.setValue(EVT_VARIANT_TYPE.EvtVarTypeBoolean, new BOOL(true));","handlingStrategy":"type-guard","validationCode":"boolean ok = value instanceof BOOL\n    || (value != null && value.getClass() == BOOL[].class);\nif (!ok) throw new IllegalArgumentException(\"Boolean variant needs BOOL/BOOL[]\");","typeGuard":"boolean isBoolVariant(Object v) {\n    return v instanceof BOOL || (v != null && v.getClass() == BOOL[].class);\n}","tryCatchPattern":"try {\n    variant.setValue(EVT_VARIANT_TYPE.EvtVarTypeBoolean, value);\n} catch (IllegalArgumentException e) {\n    variant.setValue(EVT_VARIANT_TYPE.EvtVarTypeBoolean,\n        new BOOL(((Boolean) value).booleanValue()));\n}","preventionTips":["Always wrap booleans in com.sun.jna.platform.win32.BOOL for the Windows Event Log API","Convert boolean[]/Boolean[] to BOOL[] before setValue","Note that java.lang.Boolean and boolean[] are both rejected — this is JNA, not auto-boxing territory"],"tags":["windows-eventlog","jna","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"d036ad9781adad4b66693e8fa7098e4ac665e0a3","analyzedAt":"2026-09-12T06:50:59.239Z","contentChangedAt":"2026-09-12T06:50:59.239Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}