2016-02-17 5 views
0

У меня есть следующий фрагмент кода из моего класса тестера.Ошибка вычисления parseInteger Java

 FileReader freader=new FileReader(filename); 
    BufferedReader inputFile=new BufferedReader(freader); 
    int numScores = 0; 
    String playerType = ""; 
    String nameHome = ""; 
    String playerName = ""; 
    String home = ""; 
    String location = ""; 
    int score = 0; 
    String date = ""; 
    double courseRating = 0; 
    int courseSlope = 0; 

    ArrayList<Player> players = new ArrayList<Player>(); 

    while (inputFile.read()!= -1) { 
     numScores = Integer.parseInt(inputFile.readLine()); 
     playerType = inputFile.readLine(); 
     nameHome = inputFile.readLine(); 
     StringTokenizer st = new StringTokenizer(nameHome,","); 
     playerName = st.nextToken(); 
     home = st.nextToken(); 

Программа компилируется, однако при запуске тестера я получаю следующую ошибку вывода.

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:592) 
at java.lang.Integer.parseInt(Integer.java:615) 
at PlayerTest.main(PlayerTest.java:34) 

Я попытался исследовать это и то, что я Фульда был там, возможно, пространство, когда он изменяет строку, которая считывается из файла данных и преобразует его в междунар. Я пробовал читать прямо в strin, обрезая строку, а затем преобразовывая в int, но он получил ту же ошибку.

Это был код, который заменил numScores = Integer.parseInt (inputFile.readLine());

 tempScores = inputFile.readLine(); 
      tempScores.trim(); 
      System.out.println(tempScores); 
      numScores = Integer.parseInt(tempScores); 

Любая помощь приветствуется.

* отредактирован, чтобы показать образец данных выборки данных из файла

3 
B 
James Smith, Strikers 
FWB Bowling, 112,09/22/2012 
White Sands, 142,09/24/2012 
Cordova Lanes,203,09/24/2012 
+0

ясно «» не является числом ... – StackFlowed

+0

Используйте отладчик. Добавьте переменную String и назначьте значение строки чтения. Verify - это фактическое число. Если он проверяет каждый символ. –

ответ

3

Возможно, файл содержит пустые строки. Они считываются как «" и поэтому не могут быть преобразованы в int.

Кроме того, возможно, что вы прочитали первый символ каждой строки с помощью инструкции чтения в заголовке цикла while, так что она игнорируется в команде readline. Тогда число длиной 1 (например, «1») станет пустой линией.

В любом случае, построение вашей петли является ошибкой.

+0

Этот файл не содержит пустых строк, это просто для инициализации переменных. –

+0

После добавления оператора вывода первая прочитанная строка пуста. –

+0

Что такое лучший способ выполнить цикл, не отвлекаясь от первой строки? –

1

Вы можете поместить все это в if заявление:

if(!tempScores.equalsIgnoreCase("")) 
{ 
+0

equalsIgnoreCase для пустой строки? и почему бы не поставить постоянную с левой стороны, чтобы избежать NPE? – rkosegi

0

Вы должны понимать, что this загляните в него.

Basic понимание

try { 
    //Something that can throw an exception. 
} catch (Exception e) { 
    // To do whatever when the exception is caught. 
} 

Существует также, наконец, блок, который всегда будет выполняться, даже если есть ошибка. он используется как этот

try { 
    //Something that can throw an exception. 
} catch (Exception e) { 
    // To do whatever when the exception is caught & the returned. 
} finally { 
    // This will always execute if there is an exception or no exception. 
} 

В вашем конкретном случае, вы можете иметь следующие исключения (link).

InputMismatchException - если следующий токен не соответствует регулярному выражению Integer или находится вне диапазона NoSuchElementException - если вход будет исчерпан IllegalStateException - если этот сканер закрыт

Так что вам нужно будет ловить исключения, как

try { 
    rows=scan.nextInt(); 
} catch (InputMismatchException e) { 
    // When the InputMismatchException is caught. 
    System.out.println("The next token does not match the Integer regular expression, or is out of range"); 
} catch (NoSuchElementException e) { 
    // When the NoSuchElementException is caught. 
    System.out.println("Input is exhausted"); 
} catch (IllegalStateException e) { 
    // When the IllegalStateException is caught. 
    System.out.println("Scanner is close"); 
} 
1

Сегодня я столкнулся с подобной проблемой. Я читал ответ от конечной точки REST и пытался разобрать ответ json. Бам! ударил ошибку. Позже я понял, что у файла есть спецификация.

Мое предложение создать вар

String var = inputFile.readLine(); 
int numScores = Integer.parseInt(var); 

добавить контрольную точку и проверить, что переменная содержит, в моем случае ответ был BOM пустой юникод символов кода 65279/0xfeff. В любом отладчике стоит соль, вы должны видеть каждого персонажа.

Если это так, вам нужно удалить это значение из строки.

Я использовал эту библиотеку, чтобы обнаружить эту проблему org.yaml: snakeyaml: 1,16

import org.yaml.snakeyaml.reader.UnicodeReader; 

//more code 

    private String readStream(InputStream inputStream) throws IOException { 
    UnicodeReader unicodeReader = new UnicodeReader(inputStream); 
    char[] charBuffer = new char[BUFFER_SIZE]; 
    int read; 
    StringBuilder buffer = new StringBuilder(BUFFER_SIZE); 
    while ((read = unicodeReader.read(charBuffer,0,BUFFER_SIZE)) != -1) { 
     buffer.append(charBuffer, 0, read); 
    } 
    return buffer.toString(); 
    } 
+0

Благодарим вас за ввод. –

Смежные вопросы