Integer.parseInt有时会出现NumberFormatException

时间:2015-01-02 00:55:33

标签: java parseint

我有一个程序,用户在JTextField中输入一个数字(将是一个整数)。使用Integer.parseInt()获取JTextField中输入内容的程序。通常程序运行顺利,没有问题。但是,偶尔我会得到一个NumberFormatException,即使是相同的数字。例如,在程序的一次运行中,我可以在JTextField中输入5。在另一次运行中,我可以做同样的事情并在JTextField中输入5,我会得到一个NumberFormatException。我没有更改代码或任何东西,所以我不明白为什么会发生这种情况。以下是代码的一部分:

JPanel an = new JPanel(new GridBagLayout());
JLabel assignNamesLabel = new JLabel("Assign Book Names");
JLabel bookNumberLabel = new JLabel("Book Number");
JLabel nameOfBookLabel = new JLabel("Book Name");
final JTextField bookNumber = new JTextField(20);
final JTextField bookName = new JTextField(20);
JButton assignName = new JButton("Assign");

assignNamesLabel.setFont(f);
gbc.gridx = 1;
gbc.gridy = 0;
an.add(assignNamesLabel, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
an.add(bookNumberLabel, gbc);
gbc.gridx = 1;
an.add(bookNumber, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
an.add(nameOfBookLabel, gbc);
gbc.gridx = 1;
an.add(bookName, gbc);
gbc.gridy = 3;
gbc.gridx = 1;
an.add(assignName, gbc);

assignNamesPanel.add(an, BorderLayout.CENTER);

tabs.addTab("Assign Book Names", assignNamesPanel);
// function
assignName.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        int i = Integer.parseInt(bookNumber.getText());
        if (shelf.book[i] == null) {
            shelf.book[i] = new shelf();
        }
        shelf.book[i].bookName = bookName.getText();
        bookNumber.setText("");
        bookName.setText("");
        bookNumber.requestFocus();
    }
});

我有时会收到错误:

int i = Integer.parseInt(bookNumber.getText());

3 个答案:

答案 0 :(得分:0)

我会在尝试解析它之前添加一些逻辑来验证它是一个数字。由于原始整数不能为空,因此返回-1。您可以检查以查看处理后的值是否也有效。当然,-1只是一个例子。如果您需要-1有效,只需制作默认的Integer.MIN_VALUE或其他内容。

抓住错误是首选的方式,即parseIntSafelyWithCatch()。您还可以使用提取方法,即parseIntSafelyWithExtraction()作为替代方法,以避免异常处理。

的NumberValidator

public class NumberValidator {
    public static final String INT_REGEX = "[^-?0-9]+";
    public static final String CONTAINS_INT_REGEX = "^.*[-?0-9]+.*$";

    public static int parseIntSafelyWithCatch(String value) {
        if (value == null || value.isEmpty()) {
            return -1;
        }
        try {
            return Integer.parseInt(value.trim());
        } catch (NumberFormatException e) {
            return -1;
        }
    }

    public static int parseIntSafelyWithExtraction(String value) {
        if (value == null || value.isEmpty()) {
            return -1;
        }
        if (value.matches(CONTAINS_INT_REGEX)) {
            return Integer.parseInt(value.replaceAll(INT_REGEX, ""));
        }

        return -1;
    }

    public static boolean isValidNumber(int value) {
        return value != -1;
    }

    public static void main(String[] args) {
        System.out.println(parseIntSafelyWithCatch("")); // -1
        System.out.println(parseIntSafelyWithCatch("42")); // 42
        System.out.println(parseIntSafelyWithCatch(" 42")); // 42
        System.out.println(parseIntSafelyWithCatch(" 42 ")); // 42
        System.out.println(parseIntSafelyWithCatch("-42")); // -42
    }
}

用法

int i = NumberValidator.parseIntSafelyWithCatch(bookNumber.getText());
boolean isValid = NumberValidator.isValidInteger(i);

答案 1 :(得分:0)

String number = bookNumber.getText().trim();

if(!number.isEmpty())
{
// proceed
}

答案 2 :(得分:-1)

最可能的问题是数字之前或之后的空格字符。将您的代码更改为:

int i = Integer.parseInt(bookNumber.getText().trim());