Mocktagish
Mocktagish

Reputation: 291

Proper way to avoid parseInt throwing a NumberFormatException for input string: ""

When I run parseInt:

Integer.parseInt(myString);

it throws:

NumberFormatException: For input string: ""

Does this mean I have do something like this?

if(StringUtils.isNotBlank(myString))
  return Integer.parseInt(myString);
else
 return 0;

Upvotes: 20

Views: 43511

Answers (7)

Dave Newton
Dave Newton

Reputation: 160321

Yes, but: Wrap it in a thin method (and eliminate the redundant else), or use an existing implementation, like Commons Lang's NumberUtils.toInt(str, defaultValue):

NumberUtils.toInt(myString, 0);

This method handles null values and conversion failures.

Writing the same thing on your own is straight-forward:

  • Check for null, and/or...
  • ...Wrap the NumberFormatExtension exception

Upvotes: 32

Oleg Mikhailov
Oleg Mikhailov

Reputation: 6081

If the string can be empty I do it this way:

Integer.parseInt("0" + inputString)

When I'm not sure it contains only digits:

Integer.parseInt(0 + inputString.replaceAll("\\D+",""))

Upvotes: 9

gndp
gndp

Reputation: 229

I don't know why was I searching for this but here's the easy way:

int test=str.isEmpty()?0:Integer.parseInt(str);

Upvotes: 0

Dan Hardiker
Dan Hardiker

Reputation: 3053

Integer.parseInt(String) doesn't accept non-numeric input, including nulls and empty strings.

Either guard against that like you suggested, or catch the NFE.

Upvotes: 0

Bohemian
Bohemian

Reputation: 425448

What you have is fine, but as a coding style I prefer to make tests "positive" (isBlank), rather than "negative" (isNotBlank), ie

if (StringUtils.isBlank(myString)) {
    return 0;
}
return Integer.parseInt(myString); // Note: No need for else when the if returns

or, more succinctly:

return StringUtils.isBlank(myString) ? 0 : Integer.parseInt(myString);

Upvotes: 4

Jon Skeet
Jon Skeet

Reputation: 1504072

Well, you could use the conditional operator instead:

return StringUtils.isNotBlank(myString) ? Integer.parseInt(myString) : 0;

If you need to do this in multiple places, you'd probably want to put this into a separate method. Note that you should also consider situations where myString is null, or contains non-numeric text.

Upvotes: 23

ziesemer
ziesemer

Reputation: 28707

Yes. (Validate your inputs before making assumptions about what are in them. :-)

+1 for already finding Apache's common-lang w/ StringUtils.

Upvotes: 0

Related Questions