{"record":{"id":"2da7f13dd3bc8e76","repo":"MuntashirAkon/AppManager","slug":"invalid-format-packagename-not-found-for-external-rule","errorCode":null,"errorMessage":"Invalid format: packageName not found for external rule.","messagePattern":"Invalid format: packageName not found for external rule\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java","lineNumber":69,"sourceCode":"\n    protected String addPackageWithTab(boolean isExternal) {\n        return (isExternal ? packageName + \"\\t\" : \"\");\n    }\n\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);","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java#L51-L87","documentation":"RuleEntry.unflattenFromString, when parsing the external-rule format (marked by a leading delimiter), requires the first token to be the package name. If the tokenizer is exhausted at that point, it throws this IllegalArgumentException because an external rule cannot be parsed without a package name.","triggerScenarios":"Calling unflattenFromString (or a subclass factory) on an external-format string whose token list is empty after the initial delimiter, e.g. an empty or delimiter-only string.","commonSituations":"Empty lines in an imported rules file, strings containing only the external-rule marker, or split operations producing zero tokens.","solutions":["Provide a non-empty flattened string beginning with the package name","Skip empty/blank lines before calling unflattenFromString","Check tokenizer.hasMoreElements() before parsing external rules","Catch IllegalArgumentException and treat the line as invalid import data"],"exampleFix":"// before\nRuleEntry.unflattenFromString(\"\\t\", null); // throws: no packageName token\n// after\nif (str != null && str.trim().length() > 1) RuleEntry.unflattenFromString(str, null);","handlingStrategy":"validation","validationCode":"if (line == null || line.trim().isEmpty()) return;\nString[] p = line.split(\"\\t\");\nif (p.length < 1 || p[0].isEmpty()) throw new IllegalArgumentException(\"external rule needs packageName\");","typeGuard":"boolean hasPackageName(String line) { String[] p = line.trim().split(\"\\t\"); return p.length >= 1 && !p[0].isEmpty(); }","tryCatchPattern":"try { RuleEntry.unflattenFromString(line, null); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"packageName\")) skipBlank(line); }","preventionTips":["Skip empty and delimiter-only lines before parsing","Never call unflattenFromString on null/empty input","Trim whitespace and strip the external-rule marker carefully so tokens remain"],"tags":["rules-parsing","external-rules","illegal-argument"],"backgroundTag":"invalid-argument-format","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"}