2011-02-03 4 views
1

У меня есть текстовый файл, в котором первые две строки являются целыми числами m и n, тогда есть m строк, каждая из которых имеет n значения, разделенные линией. Я написал программу, которая читает файл и создает массив m*n со значениями из файла, и он работал отлично для bajillion раз, а затем из неожиданного, с тем же кодом, с тем же файлом, он бросил NumberFormatException, читая целое число из первой строки. Весь код здесь:Java throws NumberFormatException

public class Thegame extends JFrame { 
    public Integer st; 
    public Integer el; 
    public String[][] tab; 

    public Thegame(String pth) 
    { 
     setSize(640,480); 
     setTitle(pth); 
     File file = new File(pth); 
     try 
     { 
      BufferedReader rdr = new BufferedReader(new FileReader(file)); 
      st = Integer.valueOf(rdr.readLine()); 
      el = Integer.valueOf(rdr.readLine()); 
      tab = new String[st][el]; 
      for(Integer i=0; i<st; i++) 
      { 
       String lin = rdr.readLine(); 
       StringTokenizer spl = new StringTokenizer(lin,"|"); 
       for(Integer j=0; j<el; j++) 
       { 
        tab[i][j] = spl.nextToken(); 
       }     
      } 
      rdr.close();    
     } 
     catch(Exception ex) 
     { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
    } 
} 

Что действительно меня беспокоит то, что тот же код работал нормально до и из ниоткуда оказалось плохо, так что я даже не могу сказать, что именно не так ...

+1

Какая строка вызывает исключение NumberFormatException? – templatetypedef

+0

Да, не могли бы вы опубликовать трассировку стека с Исключением? Кроме того, копия файла, который вы читаете. – Argote

+1

Я уверен, что «без причины» - очень сильное утверждение ... Можете ли вы сделать несколько простых System.out.println в строках, которые вы пытаетесь проанализировать? (результаты rdr.readLine())? – chahuistle

ответ

1

Что-то должно измениться, иначе это волшебство. Возможные подозреваемые:

  • содержание входного файла изменено. Вы проверили его с помощью какого-то шестнадцатеричного редактора. Действительно ли файл начинается с цифр?
  • Изменение языка Java/системы. То, что ранее рассматривалось как число, больше не является числом в новой локали. Типичными уловами с локалью являются тысячи разделителей (,).
1

два возможных проблемных линий:

st = Integer.valueOf(rdr.readLine()); 
el = Integer.valueOf(rdr.readLine()); 

Вы должны убедиться, что читатель читает на самом деле Integer.

Попробуйте следующую небольшую модификацию:

st = Integer.valueOf(rdr.readLine().trim()); 
el = Integer.valueOf(rdr.readLine().trim()); 

Если это не исправить, вам нужно, чтобы убедиться, что вы захватываете правильный вход.

Для устранения проблем, это может быть полезно, чтобы сохранить ввод в строку и распечатать его, чтобы увидеть, как он выглядит, прежде чем пытаться разобрать его:

String stStr = rdr.readLine().trim() 
System.out.println(stStr); 
st = Integer.valueOf(stStr); 
System.out.println(stStr); 
String elStr = rdr.readLine().trim(); 
el = Integer.valueOf(elStr); 

Если значения, которые печатаются Арен 't целых чисел, то вы неправильно вводите ввод.

0

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

0

Если поведение изменилось, что-то изменилось.

Если код не изменился, то либо:

  • Файла считывания изменено: искать специальные (не читаемые) символы с шестнадцатеричным редактором. Если у вас есть входной файл, который не вызывает исключения, сравните его с тем, который делает (опять же, шестнадцатеричное сравнение).
  • Среда java изменилась: проверьте изменения в конфигурации виртуальной машины Java, особенно locale.
0

Изменение:

 st = Integer.valueOf(rdr.readLine()); 
     el = Integer.valueOf(rdr.readLine()); 

быть

String input = rdr.readLine(); 
try { 
    st = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 
input = rdr.readLine(); 
try { 
    el = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 

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