Java выдает NumberFormatException - PullRequest
       0

Java выдает NumberFormatException

1 голос
/ 04 февраля 2011

У меня есть текстовый файл, где первые две строки представляют собой целые числа m и n, затем есть m строки, каждая из которых имеет n значения, разделенные символом трубы. Я написал программу, которая читает файл и создает массив m*n со значениями из файла, и он отлично работал несколько раз, а затем неожиданно, с тем же кодом, с тем же файлом, он бросил 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);
        }
    }
}

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

Ответы [ 5 ]

1 голос
/ 04 февраля 2011

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

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

Возможны две возможные проблемы:

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

Если напечатанные значения не являются целыми числами, значит, вы неправильно вводите данные.

0 голосов
/ 04 февраля 2011

Измените:

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

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

0 голосов
/ 04 февраля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...