java.lang.NumberFormatException: для входной строки: 23

Я дал 23 (выглядит как правильная строка) в качестве входных данных, но все равно получил NumberFormatException. Пожалуйста, укажите, где я ошибся.

PS Я пытался решить "проблему шеф-повара и строк" на codechef

Соответствующий код:

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);

Выход:

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)

Полная программа:

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();
  }


}

person gnsb    schedule 18.02.2015    source источник


Ответы (5)


Ваша строка имеет завершающий пробел.

int Q = Integer.parseInt(tempStr.trim());
person Eran    schedule 18.02.2015

Используйте Scanner.nextInt() и не анализировать строку.

Также полезен метод Scanner. hasNextInt().

person Paco Abato    schedule 18.02.2015

Взгляните на закрывающую двойную кавычку " в исключении — она расположена на следующей строке, что означает, что входная строка имеет '\n' или '\r' в конце.

Вы можете исправить это, вызвав trim() перед передачей строки методу синтаксического анализа, но вам лучше использовать next() для удаления символа конца строки, используя системный разделитель строк, например:

cin.useDelimiter(System.lineSeparator());

или позвонив по номеру hasNextInt/nextInt, чтобы сканер выполнил преобразование.

person Sergey Kalinichenko    schedule 18.02.2015

Это мой стандартный ответ на такие вопросы:

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)

означает:

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.

Другими словами, вы пытались преобразовать "23\n" в int то, что Java не может сделать с помощью метода Integer.parseInt. Java предоставил красивую трассировку стека, которая точно говорит вам, в чем проблема. Вам нужен отладчик, и использование точек останова позволит вам проверить состояние вашего приложения в выбранный момент.

Как упоминалось ранее, безопасно использовать tempStr.trimm() перед синтаксическим анализом в int.

person xenteros    schedule 12.10.2016

Входная строка, если она анализируется как целое число, должна быть допустимым целочисленным значением без десятичной точки, пробела, разрыва строки или любого другого символа. Поэтому убедитесь, что исключение, вызываемое входной строкой, является допустимым целым числом или нет, если оно содержит какой-либо другой символ, десятичное число, пробел/разрыв строки, а затем попробуйте удалить это.

person A.Aleem11    schedule 06.10.2016