Tutorials Logic, IN info@tutorialslogic.com

NumberFormatException in Java: Causes, Fixes, Examples & Interview Tips

What is This Error?

The NumberFormatException is thrown when you try to convert a String to a numeric type (int, long, double, etc.) but the string doesn't contain a valid number. It's a subclass of IllegalArgumentException.

Common Causes

  • String contains letters or special characters
  • Parsing a decimal string as integer (e.g., "12.5" with parseInt)
  • String has leading/trailing whitespace
  • Empty string or null passed to parse method
  • Number exceeds the type's range (overflow)

Quick Fix (TL;DR)

Quick Solution

Quick Solution
// ❌ Problem
int num = Integer.parseInt("abc"); // NumberFormatException!

// ✅ Solution 1: try-catch
try {
    int num = Integer.parseInt(input.trim());
} catch (NumberFormatException e) {
    System.out.println("Invalid number: " + input);
}

// ✅ Solution 2: Validate first
if (input.matches("-?\\d+")) {
    int num = Integer.parseInt(input);
}

Common Scenarios & Solutions

Problem

Problem
Scanner scanner = new Scanner(System.in);
System.out.print("Enter age: ");
String input = scanner.nextLine();
int age = Integer.parseInt(input); // Crashes if user types "twenty"!

Solution

Solution
Scanner scanner = new Scanner(System.in);
int age = -1;

while (age < 0) {
    System.out.print("Enter age: ");
    String input = scanner.nextLine().trim();
    try {
        age = Integer.parseInt(input);
        if (age < 0 || age > 150) {
            System.out.println("Please enter a valid age (0-150)");
            age = -1;
        }
    } catch (NumberFormatException e) {
        System.out.println("Invalid input. Please enter a number.");
    }
}
System.out.println("Age: " + age);

Problem

Problem
String price = "19.99";
int p = Integer.parseInt(price); // NumberFormatException! "19.99" is not an int

Solution

Solution
String price = "19.99";

// ✅ Parse as double
double p = Double.parseDouble(price); // 19.99

// ✅ Or parse as int after truncating
int pInt = (int) Double.parseDouble(price); // 19

// ✅ Use BigDecimal for money
BigDecimal bd = new BigDecimal(price); // Exact representation

Problem

Problem
String input = " 42 "; // Has spaces!
int num = Integer.parseInt(input); // NumberFormatException!

Solution

Solution
String input = " 42 ";
int num = Integer.parseInt(input.trim()); // ✅ Always trim first!

Solution

Solution
// ✅ Reusable safe parse method
public static Optional<Integer> safeParseInt(String s) {
    if (s == null || s.trim().isEmpty()) return Optional.empty();
    try {
        return Optional.of(Integer.parseInt(s.trim()));
    } catch (NumberFormatException e) {
        return Optional.empty();
    }
}

// Usage
safeParseInt("42").ifPresent(n -> System.out.println("Parsed: " + n));
safeParseInt("abc").ifPresentOrElse(
    n -> System.out.println(n),
    () -> System.out.println("Invalid number")
);

Best Practices to Avoid This Error

  • Always trim() before parsing - Remove leading/trailing whitespace
  • Validate with regex before parsing - Use matches("-?\d+") for integers
  • Use try-catch for user input - Users can type anything
  • Use the right parse method - parseInt for int, parseDouble for decimals
  • Create safe parse helper methods - Reusable validation logic
  • Use BigDecimal for money - Avoids floating-point precision issues
  • Check for null/empty before parsing - Prevent NullPointerException too

Related Errors

Frequently Asked Questions

It's thrown when Integer.parseInt(), Double.parseDouble(), or similar methods receive a string that doesn't represent a valid number "” like "abc", "12.5" (for parseInt), or strings with spaces.

First parse as double, then cast: (int) Double.parseDouble("12.5") gives 12. Or use Math.round() to round: (int) Math.round(Double.parseDouble("12.5")) gives 13.

Use regex: input.matches("-?\d+") for integers, input.matches("-?\d+(\.\d+)?") for decimals. Or use try-catch which is simpler for most cases.

Integer.parseInt() returns a primitive int. Integer.valueOf() returns an Integer object (autoboxed). Both throw NumberFormatException for invalid input.

Use a try-catch loop that keeps asking until valid input is provided. Always trim() the input first. Provide clear error messages telling the user what format is expected.

Ready to Level Up Your Skills?

Explore 500+ free tutorials across 20+ languages and frameworks.