问题
I gave 23 (looks like a proper string) as input, but stil get NumberFormatException. Please point out where I went wrong.
PS I was trying to solve "chef and strings problem" on codechef
Relevent code:
Scanner cin=new Scanner(System.in);
cin.useDelimiter("\n");
String data=cin.next();
System.out.println(data);
/*
* @param Q no. of chef's requests
*/
String tempStr=cin.next();
System.out.println(tempStr);;
int Q = Integer.parseInt(tempStr);
Output:
sdfgsdg
sdfgsdg
23
23
Exception in thread "main" java.lang.NumberFormatException: For input string: "23
"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Chef.RegexTestHarness.main(RegexTestHarness.java:24)
Complete program:
package Chef;
//
//TODO codechef constraints
import java.util.Scanner;
import java.lang.*;
import java.io.*;
//TODO RETURN TYPE
class RegexTestHarness
{
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
cin.useDelimiter("\n");
String data=cin.next();
System.out.println(data);
/*
* @param Q no. of chef's requests
*/
String tempStr=cin.next();
System.out.println(tempStr);;
int Q = Integer.parseInt(tempStr);
for(int i=0; i<Q; i++)
{
/*
* @param s chef's request
*/
String s= cin.next();//request
//void getParam() (returning multiple parameters problem)
//{a b L R
//where a:start letter
//b: end lettert
//L: minStartIndex
//L<=S[i]<=E[i]<=R
//R is the maxEndIndex
//TODO transfer to main
char a=s.charAt(0);
char b=s.charAt(3);
int L=0, R=0;
/*
* @param indexOfR in the request string s, we separate R (which is maxEndIndex of chef's
* good string inside data string)
* . To do that, we first need the index of R itself in request string s
*/
int indexOfR= s.indexOf(" ", 5) +1;
System.out.println("indexOfR is:" + s.indexOf(" ", 5));
L= Integer.parseInt( s.substring(5, indexOfR - 2) );
//TODO check if R,L<10^6
R=Integer.parseInt( s.substring(indexOfR) );
//} ( end getparam() )
//-----------------------------------
//now we have a b L R
//String good="";
//TODO add other constraints (like L<si.....) here
if(a !=b)
{ int startInd=data.indexOf(a, L), endInd=data.lastIndexOf(b, R);
int output=0, temp;
while((startInd<endInd)&&(startInd != (-1) ) && ( endInd != (-1) ))
{
temp = endInd;
while((startInd<endInd))
{
//good= good+ s.substring(startInd, endInd);
output++;
endInd=data.lastIndexOf(b, endInd);
}
startInd=data.indexOf(a, startInd);
//TODO if i comment the line below, eclipse says tat the variable temp
//(declared at line 68) is not used. Whereas it is used at 68
//(and 83, the line below)
endInd=temp;
}
System.out.println(output);
}
}//end for
cin.close();
}
}
回答1:
Your String has a trailing white space.
int Q = Integer.parseInt(tempStr.trim());
回答2:
Use Scanner.nextInt() and avoid to parse the String.
Also it's useful the method Scanner.hasNextInt().
回答3:
Take a look at the closing doublequote "
on the exception - it is positioned on the next line, meaning that the input string has '\n'
or '\r'
at the end.
You can fix this by calling trim()
before passing the string to the parsing method, but you would be better off having next()
strip the end-of-line character for you by using system-specific line separator, like this:
cin.useDelimiter(System.lineSeparator());
or by calling hasNextInt
/nextInt
to let the scanner do the conversion.
回答4:
Input String if parsed as integer then its must be valid integer value no decimal, space, line-break or any other character. So make sure The Input String throw in exception is valid integer or not if contain any other character, decimal, space/line-break then try to remove that.
回答5:
It's my standard answer to such questions:
Exception in thread "main" java.lang.NumberFormatException: For input string: "23
"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Chef.RegexTestHarness.main(RegexTestHarness.java:24)
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 "23\n".
which was invoked from method main in file RegexTestHarness.java in line 24.
In other words, you tried to parse "23\n"
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.
As mentioned before, it's safe to use tempStr.trimm()
before parsing to the int.
来源:https://stackoverflow.com/questions/28586430/java-lang-numberformatexception-for-input-string-23