{"record":{"id":"86aa5a8e17904b92","repo":"Konloch/bytecode-viewer","slug":"unable-to-resolve-type","errorCode":null,"errorMessage":"Unable to resolve type.","messagePattern":"Unable to resolve type\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/main/java/the/bytecode/club/bytecodeviewer/decompilers/impl/ProcyonDecompiler.java","lineNumber":175,"sourceCode":"                {\n                    JarEntry entry = ent.nextElement();\n\n                    if (entry.getName().endsWith(\".class\"))\n                    {\n                        JarEntry etn = new JarEntry(entry.getName().replace(\".class\", \".java\"));\n\n                        if (history.add(etn))\n                        {\n                            zip.putNextEntry(etn);\n\n                            try\n                            {\n                                String internalName = StringUtilities.removeRight(entry.getName(), \".class\");\n                                TypeReference type = metadataSystem.lookupType(internalName);\n                                TypeDefinition resolvedType;\n\n                                if ((type == null) || ((resolvedType = type.resolve()) == null))\n                                    throw new Exception(\"Unable to resolve type.\");\n\n                                Writer writer = new OutputStreamWriter(zip);\n                                settings.getLanguage().decompileType(resolvedType, new PlainTextOutput(writer), decompilationOptions);\n                                writer.flush();\n                            }\n                            finally\n                            {\n                                zip.closeEntry();\n                            }\n                        }\n                    }\n                    else\n                    {\n                        try\n                        {\n                            JarEntry etn = new JarEntry(entry.getName());\n\n                            if (history.add(etn))","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/Konloch/bytecode-viewer/blob/31430e0033fa220db566b5ef461256727ff6793b/src/main/java/the/bytecode/club/bytecodeviewer/decompilers/impl/ProcyonDecompiler.java#L157-L193","documentation":"ProcyonDecompiler.decompileToZip throws this per entry while bulk-decompiling: metadataSystem.lookupType(internalName) returned null or the returned TypeReference could not be resolved to a TypeDefinition. It means one .class entry in the input jar could not be loaded by Procyon's metadata system, so it is skipped-with-exception instead of decompiled.","triggerScenarios":"Iterating a jar/zip whose entries include malformed or unsupported class files; internalName derivation from entry name mismatching what lookupType expects; multi-release jars or classes referencing missing outer/inner types; entries not actually .class content despite the extension.","commonSituations":"Decompiling dependency jars with intentionally broken or anti-decompiler entries; shaded jars with corrupt duplicates; jars built for class-file versions newer than the decompiler supports; obfuscated jars (ProGuard/Allatori) with inconsistent name references.","solutions":["Skip-and-continue per entry on this exception so the rest of the jar decompiles.","Validate each entry (magic/version) before decompiling and report failures in a summary.","Upgrade the decompiler/backend to a Procyon version supporting the jar's class-file versions.","Check entry-name handling (removeRight \".class\", package path) matches lookupType's expected internal name."],"exampleFix":"// before\nif ((type == null) || ((resolvedType = type.resolve()) == null))\n    throw new Exception(\"Unable to resolve type.\");\n// after\nif ((type == null) || ((resolvedType = type.resolve()) == null)) {\n    log.warn(\"Skipping unresolvable class: \" + entry.getName());\n    continue;\n}","handlingStrategy":"try-catch","validationCode":"// inside the per-entry loop, before decompiling\nbyte[] data = readEntry(entry);\nboolean looksLikeClass = data != null && data.length > 8 && data[0]==(byte)0xCA && data[1]==(byte)0xFE && data[2]==(byte)0xBA && data[3]==(byte)0xBE;\nif (!looksLikeClass) { log.warn(\"skip non-class entry \" + entry.getName()); continue; }","typeGuard":null,"tryCatchPattern":"try {\n    decompileEntry(entry, zip);\n} catch (Exception e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"Unable to resolve type\")) {\n        failures.add(entry.getName()); // skip-and-continue, report at end\n    } else throw e;\n}","preventionTips":["Adopt skip-and-continue semantics for bulk jar decompilation and report a failure summary","Verify entry names map to valid internal names before lookupType","Check class-file versions of jar entries against decompiler support","Expect corrupt/anti-decompiler entries in obfuscated jars and plan for them"],"tags":["java","decompiler","procyon","zip","class-resolution"],"backgroundTag":"type-resolution-failed","analyzedSha":"31430e0033fa220db566b5ef461256727ff6793b","analyzedAt":"2026-09-05T18:22:22.725Z","contentChangedAt":"2026-09-05T18:22:22.725Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}