I'm running into this situation where I need to parse a String
into an int
and I don't know what to do with the NumberFormatException
. The compiler doesn't complain when I don't catch it, but I just want to make sure that I'm handling this situation properly.
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
}
return i;
}
I want to just simplify my code like this. The compiler doesn't have a problem with it, but the thread dies on the NumberFormatException
.
private int getCurrentPieceAsInt() {
int i = 0;
i = Integer.parseInt(this.getCurrentPiece());
return i;
}
Google CodePro wants me to log the exception in some way, and I agree that this is best practice.
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
e.printStackTrace();
}
return i;
}
I want this method to return 0
when the current piece is not a number or cannot be parsed. When I don't catch the NumberFormatException
explicitly, does it not assign the variable i
? Or is there some default value that Integer.parseInt()
returns?
General style says that if I catch an exception, I should log it somewhere. I don't want to log it. It's normal operation for this exception to be thrown sometimes, which also doesn't sit well with me. I cannot find a function, however, which will tell me if Integer.parseInt()
will throw an exception. So my only course of action seems to be to just call it and catch the exception.
The javadoc for parseInt
doesn't help much.
Here are the specific questions I'd like to know:
Integer.parseInt()
will throw a NumberFormatException
before calling it? Then I would have no problem logging this, since it should never happen.AWTEvent.consume()
. If so, then I will do this so that Google CodePro doesn't see this as "unlogged".Sadly, no. At least not in the core Java API. It's easy to write one, however - just modify the code below.
If you do not catch the exception then the stack will unwind until it hits a catch block that will handle it, or it will unwind completely and halt the thread. The variable will, in fact, not be assigned but this is not exactly what you want.
There may be a way to tell CodePro to ignore this particular warning. Certainly with tools like FindBugs and Checkstyle you can turn off warnings in specific locations. (EDIT: @Andy has pointed out how to do this.)
I suspect what you want is something like the Commons lang package mentioned by @daveb. It's pretty easy to write such a function:
int parseWithDefault(String s, int def) {
try {
return Integer.parseInt(s);
}
catch (NumberFormatException e) {
// It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
return def;
}
}