From 18f6f8c30ae993406cfac4774817b0313956161f Mon Sep 17 00:00:00 2001 From: Piotr Idzik <65706193+vil02@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:33:55 +0200 Subject: [PATCH] fix: handle Null Dereference in `RomanToInteger` (#5461) --- .inferconfig | 1 - .../thealgorithms/conversions/RomanToInteger.java | 13 ++++++------- .../conversions/RomanToIntegerTest.java | 9 +++++++++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.inferconfig b/.inferconfig index 93bd1c355..e7af307a6 100644 --- a/.inferconfig +++ b/.inferconfig @@ -1,7 +1,6 @@ { "report-block-list-path-regex": [ "src/main/java/com/thealgorithms/ciphers/a5/CompositeLFSR.java", - "src/main/java/com/thealgorithms/conversions/RomanToInteger.java", "src/main/java/com/thealgorithms/datastructures/crdt/GCounter.java", "src/main/java/com/thealgorithms/datastructures/crdt/PNCounter.java", "src/main/java/com/thealgorithms/datastructures/graphs/KahnsAlgorithm.java", diff --git a/src/main/java/com/thealgorithms/conversions/RomanToInteger.java b/src/main/java/com/thealgorithms/conversions/RomanToInteger.java index cf2d41458..1934e9b26 100644 --- a/src/main/java/com/thealgorithms/conversions/RomanToInteger.java +++ b/src/main/java/com/thealgorithms/conversions/RomanToInteger.java @@ -19,6 +19,10 @@ public final class RomanToInteger { } }; + private static int romanSymbolToInt(final char symbol) { + return ROMAN_TO_INT.computeIfAbsent(symbol, c -> { throw new IllegalArgumentException("Unknown Roman symbol: " + c); }); + } + // Roman Number = Roman Numerals /** @@ -39,10 +43,10 @@ public final class RomanToInteger { if (prev != ' ') { // checking current Number greater than previous or not - newPrev = ROMAN_TO_INT.get(prev) > newPrev ? ROMAN_TO_INT.get(prev) : newPrev; + newPrev = romanSymbolToInt(prev) > newPrev ? romanSymbolToInt(prev) : newPrev; } - int currentNum = ROMAN_TO_INT.get(c); + int currentNum = romanSymbolToInt(c); // if current number greater than prev max previous then add if (currentNum >= newPrev) { @@ -57,9 +61,4 @@ public final class RomanToInteger { return sum; } - - public static void main(String[] args) { - int sum = romanToInt("MDCCCIV"); - System.out.println(sum); - } } diff --git a/src/test/java/com/thealgorithms/conversions/RomanToIntegerTest.java b/src/test/java/com/thealgorithms/conversions/RomanToIntegerTest.java index c51986f2a..f03563971 100644 --- a/src/test/java/com/thealgorithms/conversions/RomanToIntegerTest.java +++ b/src/test/java/com/thealgorithms/conversions/RomanToIntegerTest.java @@ -1,6 +1,7 @@ package com.thealgorithms.conversions; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; @@ -10,5 +11,13 @@ public class RomanToIntegerTest { public void testRomanToInteger() { assertEquals(1994, RomanToInteger.romanToInt("MCMXCIV")); assertEquals(58, RomanToInteger.romanToInt("LVIII")); + assertEquals(1804, RomanToInteger.romanToInt("MDCCCIV")); + } + + @Test + void testRomanToIntegerThrows() { + assertThrows(IllegalArgumentException.class, () -> RomanToInteger.romanToInt("Z")); + assertThrows(IllegalArgumentException.class, () -> RomanToInteger.romanToInt("MZI")); + assertThrows(IllegalArgumentException.class, () -> RomanToInteger.romanToInt("MMMO")); } }