{"record":{"id":"af021be24b47adf4","repo":"TheAlgorithms/Java","slug":"denominator-cannot-be-0","errorCode":null,"errorMessage":"Denominator cannot be 0","messagePattern":"Denominator cannot be 0","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/thealgorithms/maths/ADTFraction.java","lineNumber":13,"sourceCode":"package com.thealgorithms.maths;\n\npublic record ADTFraction(int numerator, int denominator) {\n    /**\n     * Initializes a newly created {@code ADTFraction} object so that it represents\n     * a fraction with the {@code numerator} and {@code denominator} provided as arguments.\n     *\n     * @param numerator   The fraction numerator\n     * @param denominator The fraction denominator\n     */\n    public ADTFraction {\n        if (denominator == 0) {\n            throw new IllegalArgumentException(\"Denominator cannot be 0\");\n        }\n    }\n\n    /**\n     * Add two fractions.\n     *\n     * @param fraction the {@code ADTFraction} to add\n     * @return A new {@code ADTFraction} containing the result of the operation\n     */\n    public ADTFraction plus(ADTFraction fraction) {\n        var numerator = this.denominator * fraction.numerator + this.numerator * fraction.denominator;\n        var denominator = this.denominator * fraction.denominator;\n        return new ADTFraction(numerator, denominator);\n    }\n\n    /**\n     * Multiply fraction by a number.\n     *","sourceCodeStart":1,"sourceCodeEnd":31,"githubUrl":"https://github.com/TheAlgorithms/Java/blob/fdfb9a395b310167a66bd29e311e36e0e3e9b964/src/main/java/com/thealgorithms/maths/ADTFraction.java#L1-L31","documentation":"ADTFraction is a Java record representing a fraction; its compact constructor rejects denominator == 0 because division by zero is undefined. Since records validate in the constructor, any creation of an ADTFraction with denominator 0 throws — including internal calls from plus(), times(), and reciprocal() if those produce a zero denominator.","triggerScenarios":"Constructing new ADTFraction(n, 0), or calling reciprocal() on a fraction whose numerator is 0 (reciprocal swaps num/den, yielding denominator=0). Also times(0) internally constructs ADTFraction(0,1) then multiplies — safe — but a plus/times producing a zero denominator via arithmetic is theoretically possible with overflow.","commonSituations":"Calling reciprocal() on ADTFraction(0, 5) (zero numerator), user input with denominator 0, or a computation that yields a zero denominator through cancellation/overflow.","solutions":["Validate denominator != 0 before constructing; for reciprocal, check numerator != 0 first.","When taking input, reject or prompt again if the denominator is 0.","In arithmetic chains, guard reciprocal() callers against zero numerators."],"exampleFix":"// before\nADTFraction f = new ADTFraction(3, 0);\nADTFraction r = someFraction.reciprocal(); // fails if someFraction.numerator()==0\n\n// after\nif (denominator == 0) throw new IllegalArgumentException(\"denominator must be non-zero\");\nADTFraction f = new ADTFraction(3, denominator);\nif (someFraction.numerator() == 0) throw new ArithmeticException(\"cannot invert zero fraction\");\nADTFraction r = someFraction.reciprocal();","handlingStrategy":"validation","validationCode":"if (denominator == 0) {\n    throw new IllegalArgumentException(\"denominator cannot be 0\");\n}\nnew ADTFraction(numerator, denominator);\n// for reciprocal:\nif (f.numerator() == 0) {\n    throw new ArithmeticException(\"cannot take reciprocal of a zero fraction\");\n}\nf.reciprocal();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate denominator != 0 at the input boundary before constructing fractions.","Guard reciprocal() callers: a zero numerator becomes a zero denominator after the swap.","When doing chained arithmetic, be aware that overflow could yield a zero denominator in plus/times."],"tags":["math","validation","division-by-zero","fraction","record","constructor"],"backgroundTag":null,"analyzedSha":"fdfb9a395b310167a66bd29e311e36e0e3e9b964","analyzedAt":"2026-08-13T23:36:13.315Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}