{"record":{"id":"4082dd0aaacc96bb","repo":"MuntashirAkon/AppManager","slug":"package-name-cannot-be-empty","errorCode":null,"errorMessage":"Package name cannot be empty.","messagePattern":"Package name cannot be empty\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java","lineNumber":73,"sourceCode":"\n    @NonNull\n    public static RuleEntry unflattenFromString(@Nullable String packageName, @NonNull String ruleLine,\n                                                boolean isExternal) throws IllegalArgumentException {\n        StringTokenizer tokenizer = new StringTokenizer(ruleLine, \"\\t\");\n        if (isExternal) {\n            // External rules, the first part is the package name\n            if (tokenizer.hasMoreElements()) {\n                // Match package name\n                String newPackageName = tokenizer.nextElement().toString();\n                if (packageName == null) packageName = newPackageName;\n                if (!packageName.equals(newPackageName)) {\n                    throw new IllegalArgumentException(\"Invalid format: package names do not match.\");\n                }\n            } else throw new IllegalArgumentException(\"Invalid format: packageName not found for external rule.\");\n        }\n        if (packageName == null) {\n            // packageName can't be empty\n            throw new IllegalArgumentException(\"Package name cannot be empty.\");\n        }\n        String name;\n        RuleType type;\n        if (tokenizer.hasMoreElements()) {\n            name = tokenizer.nextElement().toString();\n        } else throw new IllegalArgumentException(\"Invalid format: name not found\");\n        if (tokenizer.hasMoreElements()) {\n            try {\n                type = RuleType.valueOf(tokenizer.nextElement().toString());\n            } catch (Exception e) {\n                throw new IllegalArgumentException(\"Invalid format: Invalid type\");\n            }\n        } else throw new IllegalArgumentException(\"Invalid format: entryType not found\");\n        return getRuleEntry(packageName, name, type, tokenizer);\n    }\n\n    @NonNull\n    private static RuleEntry getRuleEntry(@NonNull String packageName, @NonNull String name,","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java#L55-L91","documentation":"After parsing (or defaulting) the package name, RuleEntry.unflattenFromString checks it is non-null/empty. If packageName is still null — meaning no package-name token was ever supplied even in internal format — it throws this IllegalArgumentException because a rule entry cannot exist without a package.","triggerScenarios":"unflattenFromString called with a string that yields no package name token (e.g. empty string in internal format), or the only token consumed elsewhere so packageName remains null.","commonSituations":"Blank lines in rules files, calling the parser with an empty String, or stripping the first token before invoking unflattenFromString.","solutions":["Pass a flattened string that contains a package name as its first token","Guard with str != null && !str.trim().isEmpty() before parsing","Skip empty lines during batch import","Catch IllegalArgumentException and log the offending line"],"exampleFix":"// before\nRuleEntry.unflattenFromString(\"\", null); // throws\n// after\nif (str == null || str.trim().isEmpty()) return null;\nRuleEntry.unflattenFromString(str, null);","handlingStrategy":"validation","validationCode":"if (str == null || str.trim().isEmpty())\n    throw new IllegalArgumentException(\"Provide a non-empty flattened rule string\");","typeGuard":"boolean isNonEmptyRuleString(String s) { return s != null && !s.trim().isEmpty(); }","tryCatchPattern":"try { RuleEntry.unflattenFromString(str, null); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"empty\")) logSkip(str); }","preventionTips":["Guard against null/blank strings before parsing","Filter empty lines when reading rules files line by line","Never pre-consume the package-name token before calling the parser"],"tags":["rules-parsing","validation","illegal-argument"],"backgroundTag":"empty-required-field","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}