{"record":{"id":"96295e05e2c3e020","repo":"opendataloader-project/opendataloader-pdf","slug":"page-numbers-must-be-positive-s","errorCode":null,"errorMessage":"Page numbers must be positive: '%s'","messagePattern":"Page numbers must be positive: '(.+?)'","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/Config.java","lineNumber":775,"sourceCode":"                parseSinglePage(trimmed, pages, result);\n            }\n        }\n\n        return result;\n    }\n\n    private static void parseRange(String range, String fullInput, List<Integer> result) {\n        String[] parts = range.split(\"-\", SPLIT_KEEP_EMPTY_TRAILING);\n        if (parts.length != 2 || parts[0].isEmpty() || parts[1].isEmpty()) {\n            throw new IllegalArgumentException(String.format(INVALID_PAGE_RANGE_FORMAT, fullInput));\n        }\n\n        try {\n            int start = Integer.parseInt(parts[0].trim());\n            int end = Integer.parseInt(parts[1].trim());\n\n            if (start < 1 || end < 1) {\n                throw new IllegalArgumentException(\n                    String.format(\"Page numbers must be positive: '%s'\", fullInput));\n            }\n            if (start > end) {\n                throw new IllegalArgumentException(\n                    String.format(\"Invalid page range '%s': start page cannot be greater than end page\", range));\n            }\n\n            for (int i = start; i <= end; i++) {\n                result.add(i);\n            }\n        } catch (NumberFormatException e) {\n            throw new IllegalArgumentException(String.format(INVALID_PAGE_RANGE_FORMAT, fullInput));\n        }\n    }\n\n    private static void parseSinglePage(String page, String fullInput, List<Integer> result) {\n        try {\n            int pageNum = Integer.parseInt(page);","sourceCodeStart":757,"sourceCodeEnd":793,"githubUrl":"https://github.com/opendataloader-project/opendataloader-pdf/blob/a7789b8e77dd05e2b8659eb3ea12fc458f80bfb8/java/opendataloader-pdf-core/src/main/java/org/opendataloader/pdf/api/Config.java#L757-L793","documentation":"parseRange successfully parses both bounds as integers but at least one is < 1. Pages are 1-based, so 0 (or anything negative that survives parseInt, e.g. via a leading sign) is rejected as non-positive.","triggerScenarios":"config.setPages(\"0-5\"), config.setPages(\"1-0\"), config.setPages(\"0-0\").","commonSituations":"Off-by-one from zero-indexed logic fed directly into a 1-based option; negative value from a subtraction that underflows.","solutions":["Use 1-based page numbers; clamp computed bounds to a minimum of 1.","When deriving ranges programmatically, guard start/end with Math.max(1, value)."],"exampleFix":"// before: config.setPages(zeroBasedStart + \"-\" + zeroBasedEnd);\n// after:  config.setPages(Math.max(1, zeroBasedStart + 1) + \"-\" + Math.max(1, zeroBasedEnd + 1));","handlingStrategy":"validation","validationCode":"for (String t : pages.split(\",\")) {\n    if (t.contains(\"-\")) {\n        String[] h = t.split(\"-\", -1);\n        if (Integer.parseInt(h[0].trim()) < 1 || Integer.parseInt(h[1].trim()) < 1)\n            throw new IllegalArgumentException(\"Page numbers must be 1-based: \" + t);\n    }\n}\nconfig.setPages(pages);","typeGuard":null,"tryCatchPattern":"try { config.setPages(raw); }\ncatch (IllegalArgumentException e) { /* clamp/reprompt with 1-based numbers */ }","preventionTips":["Pages are 1-based; never feed zero-indexed values directly.","Clamp computed bounds with Math.max(1, value)."],"tags":["configuration","validation","pages"],"backgroundTag":null,"analyzedSha":"a7789b8e77dd05e2b8659eb3ea12fc458f80bfb8","analyzedAt":"2026-08-14T05:22:03.953Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}