Error Message:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at set07102.Cards.main(Cards.java:68)
C:UsersqasimAppDataLocalNetBeansCache8.1executor-snippetsrun.xml:53: Java returned: 1
means:
There was an error. We try to give you as much information as possible
It was an Exception in main thread. It's called NumberFormatException and has occurred for input "Ace of Clubs".
at line 65th of NumberFormatException.java which is a constructor,
which was invoked from Integer.parseInt() which is in file Integer.java in line 580,
which was invoked from Integer.parseInt() which is in file Integer.java in line 615,
which was invoked from method main in file Cards.java in line 68.
It has resulted in exit code 1
In other words, you tried to parse "Ace of Clubs"
to an int
what Java can’t do with method Integer.parseInt
. Java has provided beautiful stacktrace which tells you exactly what the problem is. The tool you’re looking for is debugger and using breakpoints will allow you to inspect the state of you application at the chosen moment.
The solution might be the following logic in case you want to use parsing:
if (cards[index].startsWith("Ace"))
value = 1;
else if (cards[index].startsWith("King"))
value = 12;
else if (cards[index].startsWith("Queen"))
value = 11;
...
else {
try {
Integer.parseInt(string.substring(0, cards[index].indexOf(" ")));
} catch (NumberFormatException e){
//something went wrong
}
}
What is an Exception
in Java?
An exception is an event, which occurs during the execution of a
program, that disrupts the normal flow of the program’s instructions.
-Documentation
Constructors and usage in Integer#parseInt
static NumberFormatException forInputString(String s) {
return new NumberFormatException("For input string: "" + s + """);
}
public NumberFormatException (String s) {
super (s);
}
They are important for understanding how to read the stacktrace. Look how the NumberFormatException
is thrown from Integer#parseInt
:
if (s == null) {
throw new NumberFormatException("null");
}
or later if the format of the input String s
is not parsable:
throw NumberFormatException.forInputString(s);
What is a NumberFormatException
?
Thrown to indicate that the application has attempted to convert a string to one of the numeric types, but that the string does not have the appropriate format.
-Documentation
NumberFormatException
extends
IllegalArgumentException
. It tells us that it’s more specialized IllegalArgumentException
. Indeed, it’s used for highlighting that although, the argument type was correct (String
) the content of the String
wasn’t numeric (a,b,c,d,e,f are considered digits in HEX and are legal when needed).
How do I fix it?
Well, don’t fix the fact that it’s thrown. It’s good that it’s thrown. There are some things you need to consider:
- Can I read the stacktrace?
- Is the
String
which causes anException
anull
? - Does it look like a number?
- Is it ‘my string’ or user’s input?
- to be continued
Ad. 1.
The first line of a message is an information that the Exception occurred and the input String
which caused the problem. The String always follows :
and is quoted ("some text"
). Then you become interested in reading the stacktrace from the end, as the first few lines are usually NumberFormatException
‘s constructor, parsing method etc. Then at the end, there is your method in which you made a bug. It will be pointed out in which file it was called and in which method. Even a line will be attached. You’ll see. The example of how to read the stacktrace is above.
Ad. 2.
When you see, that instead of "For input string:"
and the input, there is a null
(not "null"
) it means, that you tried to pass the null reference to a number. If you actually want to treat is as 0 or any other number, you might be interested in my another post on StackOverflow. It’s available here.
The description of solving unexpected null
s is well described on StackOverflow thread What is a NullPointerException and how can I fix it?.
Ad. 3.
If the String
that follows the :
and is quoted looks like a number in your opinion, there might be a character which your system don’t decode or an unseen white space. Obviously " 6"
can’t be parsed as well as "123 "
can’t. It’s because of the spaces. But it can occure, that the String
will look like "6"
but actually it’s length will be larger than the number of digits you can see.
In this case I suggest using the debugger or at least System.out.println
and print the length of the String
you’re trying to parse. If it shows more than the number of digits, try passing stringToParse.trim()
to the parsing method. If it won’t work, copy the whole string after the :
and decode it using online decoder. It’ll give you codes of all characters.
There is also one case which I have found recently on StackOverflow
, that you might see, that the input looks like a number e.g. "1.86"
and it only contains those 4 characters but the error still exists. Remember, one can only parse integers with #Integer#parseInt#. For parsing decimal numbers, one should use Double#parseDouble
.
Another situation is, when the number has many digits. It might be, that it’s too large or too small to fit int
or long
. You might want to try new BigDecimal(<str>)
.
Ad. 4.
Finally we come to the place in which we agree, that we can’t avoid situations when it’s user typing «abc» as a numeric string. Why? Because he can. In a lucky case, it’s because he’s a tester or simply a geek. In a bad case it’s the attacker.
What can I do now? Well, Java gives us try-catch
you can do the following:
try {
i = Integer.parseInt(myString);
} catch (NumberFormatException e) {
e.printStackTrace();
//somehow workout the issue with an improper input. It's up to your business logic.
}
The NumberFormatException occurs when an attempt is made to convert a string with improper format into a numeric value. That means, when it is not possible to convert a string in any numeric type (float, int, etc), this exception is thrown. It is a Runtime Exception (Unchecked Exception) in Java. It is a subclass of IllegalArgumentException class. To handle this exception, try–catch block can be used.
While operating upon strings, there are times when we need to convert a number represented as a string into an integer type. The method generally used to convert String to Integer in Java is parseInt().
Usage of parseInt() method: As we already know there are two variants of this method namely as follows to get a better understanding
public static int parseInt(String s) throws NumberFormatException This function parses the string argument as a signed decimal integer.
public static int parseInt(String s, int radix) throws NumberFormatException This function parses the string argument as a signed integer in the radix specified by the second argument.
Return Type:
In simple words, both methods convert the string into its integer equivalent. The only difference being is that of the parameter radix. The first method can be considered as an equivalent of the second method with radix = 10 (Decimal).
Constructors:
- public NumberFormatException(): Constructs a NumberFormatException with no detail message.
- public NumberFormatException(String msg): Constructs a NumberFormatException with the detail message ‘msg’
Common Reasons for NumberFormatException:
There are various issues related to improper string format for conversion in numeric value. A few of them are:
1. The input string is null
Integer.parseInt("null") ;
2. The input string is empty
Float.parseFloat(“”) ;
3. The input string with leading and/or trailing white spaces
Integer abc=new Integer(“ 432 “);
4. The input string with extra symbols
Float.parseFloat(4,236);
5. The input string with non-numeric data
Double.parseDouble(“ThirtyFour”);
6. The input string is alphanumeric
Integer.valueOf(“31.two”);
7. The input string might exceed the range of the datatype storing the parsed string
Integer.parseInt(“1326589741236”);
8. Data type mismatch between input string value and the type of the method which is being used for parsing
Integer.parseInt("13.26");
Example:
Java
import
java.util.Scanner;
public
class
GFG {
public
static
void
main(String[] arg)
{
int
number;
Scanner sc =
new
Scanner(System.in);
while
(
true
) {
System.out.println(
"Enter any valid Integer: "
);
try
{
number = Integer.parseInt(sc.next());
System.out.println(
"You entered: "
+ number);
break
;
}
catch
(NumberFormatException e) {
System.out.println(
"NumberFormatException occurred"
);
}
}
}
}
Output: The below output is for different numbers been entered by the user
Enter any valid Integer: 12,017 NumberFormatException occurred Enter any valid Integer: Sixty4 NumberFormatException occurred Enter any valid Integer: null NumberFormatException occurred Enter any valid Integer: 436.25 NumberFormatException occurred Enter any valid Integer: 3.o NumberFormatException occurred Enter any valid Integer: 98562341789 NumberFormatException occurred Enter any valid Integer: 1000 You entered: 1000
Last Updated :
18 Feb, 2022
Like Article
Save Article
1. Введение
Java выдает NumberFormatException — непроверенное исключение — когда не может преобразовать String в числовой тип.
Поскольку он не отмечен, Java не заставляет нас обрабатывать или объявлять его.
В этом кратком руководстве мы опишем и продемонстрируем, что вызывает исключение NumberFormatException в Java и как его избежать или как справиться с этим .
NumberFormatException вызывают различные проблемы . Например, некоторые конструкторы и методы в Java вызывают это исключение.
Мы обсудим большинство из них в следующих разделах.
2.1. Нечисловые данные, передаваемые в конструктор
Давайте посмотрим на попытку построить объект Integer или Double с нечисловыми данными.
Оба этих оператора вызовут исключение NumberFormatException :
Integer aIntegerObj = new Integer("one"); Double doubleDecimalObj = new Double("two.2");
Давайте посмотрим на трассировку стека, которую мы получили, когда передали недопустимый ввод «one» в конструктор Integer в строке 1:
Exception in thread "main" java.lang.NumberFormatException: For input string: "one" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.(Integer.java:867) at MainClass.main(MainClass.java:11)
Это вызвало исключение NumberFormatException . Конструктору Integer не удалось внутренне понять ввод с помощью parseInt () .
Java Number API не разбирает слова на числа, поэтому мы можем исправить код, просто изменив его на ожидаемое значение:
Integer aIntegerObj = new Integer("1"); Double doubleDecimalObj = new Double("2.2");
2.2. Анализ строк, содержащих нечисловые данные
Подобно поддержке синтаксического анализа в конструкторе Java, у нас есть специальные методы синтаксического анализа, такие как par seInt (), parseDouble (), valueOf () и decode () .
Если мы попробуем сделать такие же преобразования с помощью этих:
int aIntPrim = Integer.parseInt("two"); double aDoublePrim = Double.parseDouble("two.two"); Integer aIntObj = Integer.valueOf("three"); Long decodedLong = Long.decode("64403L");
Тогда мы увидим такое же ошибочное поведение.
И мы можем исправить их аналогичным образом:
int aIntPrim = Integer.parseInt("2"); double aDoublePrim = Double.parseDouble("2.2"); Integer aIntObj = Integer.valueOf("3"); Long decodedLong = Long.decode("64403");
2.3. Передача строк с посторонними символами
Или, если мы попытаемся преобразовать строку в число с посторонними данными на входе, такими как пробелы или специальные символы:
Short shortInt = new Short("2 "); int bIntPrim = Integer.parseInt("_6000");
Тогда у нас будет та же проблема, что и раньше.
Мы можем исправить это с помощью небольших манипуляций со строками:
Short shortInt = new Short("2 ".trim()); int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); int bIntPrim = Integer.parseInt("-6000");
Обратите внимание, что здесь, в строке 3, разрешены отрицательные числа с использованием символа дефиса как знака минус.
2.4. Форматы номеров для конкретных регионов
Давайте посмотрим на особый случай номеров, зависящих от локали. В европейских регионах запятая может представлять десятичный знак. Например, «4000,1» может представлять десятичное число «4000,1».
По умолчанию мы получим NumberFormatException , пытаясь разобрать значение, содержащее запятую:
double aDoublePrim = Double.parseDouble("4000,1");
Нам нужно разрешить использование запятых и избежать исключения в этом случае. Чтобы это стало возможным, Java должна понимать запятую здесь как десятичную дробь.
Мы можем разрешить использование запятых для европейского региона и избежать исключения, используя NumberFormat .
Давайте посмотрим на это в действии на примере Locale для Франции:
NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE); Number parsedNumber = numberFormat.parse("4000,1"); assertEquals(4000.1, parsedNumber.doubleValue()); assertEquals(4000, parsedNumber.intValue());
3. Передовой опыт
Давайте поговорим о нескольких хороших практиках, которые могут помочь нам справиться с NumberFormatException :
- Не пытайтесь преобразовывать буквенные или специальные символы в числа — API чисел Java не может этого сделать.
- Возможно, мы захотим проверить входную строку с помощью регулярных выражений и выбросить исключение для недопустимых символов .
- Мы можем очистить ввод от предсказуемых известных проблем с помощью таких методов, как trim () и replaceAll () .
- В некоторых случаях вводимые специальные символы могут быть допустимыми. Для этого мы выполняем специальную обработку, например, используя NumberFormat , который поддерживает множество форматов.
4. Вывод
В этом руководстве мы обсудили NumberFormatException в Java и его причины. Понимание этого исключения может помочь нам создавать более надежные приложения.
Кроме того, мы изучили стратегии, позволяющие избежать исключения с некоторыми недопустимыми входными строками.
Наконец, мы увидели несколько передовых методов работы с NumberFormatException .
Как обычно, исходный код, используемый в примерах, можно найти на GitHub.