Почему этот Java-код генерирует исключение NumberFormatException? - PullRequest
0 голосов
/ 10 ноября 2011

Я играю с решателем судоку с графическим интерфейсом, который использует массив JTextFields (gridArray) для отображения и массив int (sudokuGrid) для фактического решения.Когда я запускаю его и он пытается привести JTextField string s к int s, он бросает NumberFormatException при разборе string s в int s, в частности это сообщение:

java.lang.NumberFormatException: For input string: ""

Вот фрагмент кода, который вызывает у меня проблемы:

// create solveButton
    solveButton = new JButton("Solve It!");
    solveButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try {
                // create grid and call Solve()
                for(int i=0;i<9;i++) {
                    for(int j=0;j<9;j++) {
                        if (gridArray[i][j].getText() == "")
                            {sudokuGrid[i][j] = 0;}
                        else {sudokuGrid[i][j] = Integer.parseInt(gridArray[i][j].getText());}
                    }
                } // end for loop

                Solver(sudokuGrid);

                // display solution
                for(int i=0;i<9;i++) {
                    for(int j=0;j<9;j++) {
                        gridArray[i][j].setText(String.valueOf(sudokuGrid[i][j]));
                    }
                } // end for loop
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(mainFrame,e.toString(),"Number Format Exception",JOptionPane.ERROR_MESSAGE);
            } catch (Exception e) {
                JOptionPane.showMessageDialog(mainFrame,"Sorry, something broke, try again.","Solve Error",JOptionPane.ERROR_MESSAGE);
            } // end try-catch
        } // end actionPerformed()
    }); // end solveButton ActionListener

Я думал, что if - else перехватит пустые поля и попробует parseInt, только еслиценное настоящее, но если кто-нибудь сможет просветить меня, я буду признателен.

Ответы [ 5 ]

2 голосов
/ 10 ноября 2011

Ваша проблема здесь:

  if (gridArray[i][j].getText() == "")

Вы не можете сравнивать строки таким образом. Вместо этого сделайте так:

if (gridArray[i][j].getText().equals("")) 
2 голосов
/ 10 ноября 2011

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

gridArray[i][j].getText().equals("")

1 голос
/ 10 ноября 2011

Не спрашивайте у TextArea его текст, так как он может быть в процессе редактирования. Проверьте сам базовый документ.

Document document = gridArray[i][j].getDocument();
sudokuGrid[i][j] = document.getLength() == 0 ? 0 : Integer.parseInt(document.getText(0, 1);

Также ... почему JTextArea? Почему не JTextField? Вы можете даже объединить это с JSpinner со значениями от 0 (который интерпретируется как пусто до 9.

0 голосов
/ 10 ноября 2011

Проблема в проверке равенства:

gridArray[i][j].getText() == ""

Это не делает то, что вы собираетесь. В Java это проверяет, являются ли две строки одним и тем же объектом, а не равны ли их значения. Вы должны использовать метод String.equals (), чтобы оценить, является ли текстовое поле пустым.

0 голосов
/ 10 ноября 2011

Использование == сравнения со строками не означает проверку на равенство текста (содержимого строки), но вместо этого равенство объектов String (тестирование - это один и тот же объект).Вместо этого используйте String.equals ().

...