{"record":{"id":"3368f85c1a16073e","repo":"skylot/jadx","slug":"unknown-type-in-literaltostring","errorCode":null,"errorMessage":"Unknown type in literalToString: ","messagePattern":"Unknown type in literalToString: ","errorType":"exception","errorClass":"JadxRuntimeException","httpStatus":null,"severity":"error","filePath":"jadx-core/src/main/java/jadx/core/codegen/TypeGen.java","lineNumber":103,"sourceCode":"\t\t\tcase INT:\n\t\t\t\treturn stringUtils.formatInteger(lit, cast);\n\t\t\tcase LONG:\n\t\t\t\treturn stringUtils.formatLong(lit, cast);\n\t\t\tcase FLOAT:\n\t\t\t\treturn StringUtils.formatFloat(Float.intBitsToFloat((int) lit));\n\t\t\tcase DOUBLE:\n\t\t\t\treturn StringUtils.formatDouble(Double.longBitsToDouble(lit));\n\n\t\t\tcase OBJECT:\n\t\t\tcase ARRAY:\n\t\t\t\tif (lit != 0) {\n\t\t\t\t\tLOG.warn(\"Wrong object literal: {} for type: {}\", lit, type);\n\t\t\t\t\treturn Long.toString(lit);\n\t\t\t\t}\n\t\t\t\treturn \"null\";\n\n\t\t\tdefault:\n\t\t\t\tthrow new JadxRuntimeException(\"Unknown type in literalToString: \" + type);\n\t\t}\n\t}\n\n\t@Nullable\n\tpublic static String literalToRawString(LiteralArg arg) {\n\t\tArgType type = arg.getType();\n\t\tif (type == null) {\n\t\t\treturn null;\n\t\t}\n\t\tlong lit = arg.getLiteral();\n\t\tswitch (type.getPrimitiveType()) {\n\t\t\tcase BOOLEAN:\n\t\t\t\treturn lit == 0 ? \"false\" : \"true\";\n\t\t\tcase CHAR:\n\t\t\t\treturn String.valueOf((char) lit);\n\n\t\t\tcase BYTE:\n\t\t\tcase SHORT:","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/codegen/TypeGen.java#L85-L121","documentation":"Thrown by TypeGen.literalToString when converting a numeric literal to source text. The switch covers all ArgType primitive kinds (BOOLEAN, CHAR, BYTE, SHORT, INT, LONG, FLOAT, DOUBLE, OBJECT, ARRAY); the default branch fires only when the ArgType's primitive kind is null or an unrecognised value. Effectively an internal type-system invariant failure.","triggerScenarios":"An ArgType with a null or unknown PrimitiveType is passed to literalToString, e.g. a VOID literal, an ArgType.UNKNOWN, or a type whose getPrimitiveType() returns null (some non-primitive, non-object constructs). Reachable during codegen for any constant/emitted literal.","commonSituations":"Malformed bytecode where a constant instruction has a missing/unknown type; intermediate type-inference producing ArgType.UNKNOWN; version skew between jadx passes; very obfuscated inputs.","solutions":["Run the latest jadx release.","Log type and type.getPrimitiveType() at the throw site to identify which ArgType is invalid.","Trace upstream: find which instruction/arg supplied the literal and fix type inference there instead of at the throw site.","Submit a minimal reproducer to jadx.","Workaround: decompile the offending class in fallback/no-debug mode or exclude it."],"exampleFix":"// before\ndefault:\n    throw new JadxRuntimeException(\"Unknown type in literalToString: \" + type);\n\n// after (graceful fallback for null/unknown primitive)\ndefault:\n    LOG.warn(\"Unknown type in literalToString: {}\", type);\n    return Long.toString(lit);","handlingStrategy":"validation","validationCode":"ArgType type = arg.getType();\nif (type == null || type.getPrimitiveType() == null) {\n    LOG.warn(\"Refusing literalToString on null/unknown type: {}\", type);\n    return Long.toString(arg.getLiteral());\n}","typeGuard":"static boolean hasKnownPrimitive(ArgType t) {\n    return t != null && t.getPrimitiveType() != null;\n}","tryCatchPattern":"try {\n    return TypeGen.literalToString(lit, type, mth, fallback);\n} catch (JadxRuntimeException e) {\n    LOG.warn(\"literalToString failed for type {}: {}\", type, e.getMessage());\n    return Long.toString(lit);\n}","preventionTips":["Never pass ArgType.UNKNOWN or VOID to literalToString; resolve the type first.","Validate type.getPrimitiveType() is non-null at the call site.","Investigate type-inference passes that leave types unresolved."],"tags":["codegen","type-system","decompiler-internal","invariant"],"backgroundTag":null,"analyzedSha":"e738a26571d02919f01df40de93bc9a44dee4e18","analyzedAt":"2026-08-14T00:10:24.238Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}