{"record":{"id":"6cded8b554aaa3da","repo":"TheAlgorithms/Java","slug":"number-must-be-positive-6cded8","errorCode":null,"errorMessage":"Number must be positive.","messagePattern":"Number must be positive\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/thealgorithms/maths/LuckyNumber.java","lineNumber":19,"sourceCode":"package com.thealgorithms.maths;\n\n/**\n * In number theory, a lucky number is a natural number in a set which is generated by a certain \"sieve\".\n * This sieve is similar to the sieve of Eratosthenes that generates the primes,\n * but it eliminates numbers based on their position in the remaining set,\n * instead of their value (or position in the initial set of natural numbers).\n *\n * Wiki: https://en.wikipedia.org/wiki/Lucky_number\n */\npublic final class LuckyNumber {\n\n    private LuckyNumber() {\n    }\n\n    // Common validation method\n    private static void validatePositiveNumber(int number) {\n        if (number <= 0) {\n            throw new IllegalArgumentException(\"Number must be positive.\");\n        }\n    }\n\n    // Function to check recursively for Lucky Number\n    private static boolean isLuckyRecursiveApproach(int n, int counter) {\n        // Base case: If counter exceeds n, number is lucky\n        if (counter > n) {\n            return true;\n        }\n\n        // If number is eliminated in this step, it's not lucky\n        if (n % counter == 0) {\n            return false;\n        }\n\n        // Calculate new position after removing every counter-th number\n        int newNumber = n - (n / counter);\n","sourceCodeStart":1,"sourceCodeEnd":37,"githubUrl":"https://github.com/TheAlgorithms/Java/blob/fdfb9a395b310167a66bd29e311e36e0e3e9b964/src/main/java/com/thealgorithms/maths/LuckyNumber.java#L1-L37","documentation":"Thrown by the private validatePositiveNumber(int number) method, invoked by both isLuckyNumber(int) and isLucky(int). Lucky numbers are defined only for natural numbers (positive integers >= 1). The sieve-based algorithm relies on positional elimination starting from position 2, which is meaningless for non-positive inputs.","triggerScenarios":"Calling LuckyNumber.isLucky(0), isLucky(-5), isLuckyNumber(0), or isLuckyNumber(-1). Any non-positive integer passed to either public method.","commonSituations":"Iterating from 0 in a lucky-number search. Passing a default int value of 0 from unconfigured state. Parsing failure that yields 0.","solutions":["Ensure the input is >= 1 before calling isLucky or isLuckyNumber","Start search loops at 1 instead of 0","Validate parsed integers before passing to the algorithm"],"exampleFix":"// before\nfor (int i = 0; i < 1000; i++) {\n    if (LuckyNumber.isLucky(i)) System.out.println(i);\n}\n\n// after\nfor (int i = 1; i < 1000; i++) {\n    if (LuckyNumber.isLucky(i)) System.out.println(i);\n}","handlingStrategy":"validation","validationCode":"if (number <= 0) {\n    throw new IllegalArgumentException(\"Input must be a positive integer: \" + number);\n}\nboolean result = LuckyNumber.isLucky(number);","typeGuard":"static boolean isValidLuckyInput(int number) {\n    return number > 0;\n}","tryCatchPattern":"try {\n    boolean result = LuckyNumber.isLucky(number);\n} catch (IllegalArgumentException e) {\n    logger.warn(\"Invalid lucky number input: {}\", number);\n}","preventionTips":["Both isLucky and isLuckyNumber enforce the same positive-input guard","Start search loops at 1 when looking for lucky numbers","Validate parsed integer inputs before passing to either method"],"tags":["math","validation","illegal-argument","number-theory"],"backgroundTag":null,"analyzedSha":"fdfb9a395b310167a66bd29e311e36e0e3e9b964","analyzedAt":"2026-08-13T23:36:13.315Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}