簡體   English   中英

Integer.parseInt有時具有NumberFormatException

[英]Integer.parseInt sometimes has NumberFormatException

我有一個程序,用戶在其中輸入數字(將是整數)到JTextField 使用Integer.parseInt()獲取在JTextField鍵入的內容的程序。 通常,程序運行平穩,沒有任何問題。 但是,即使有相同的數字,我也會NumberFormatException得到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());

在嘗試解析它之前,我將添加一些邏輯以驗證它是否為數字。 由於原始整數不能為null,因此返回-1 您可以檢查一下處理后的值是否也有效。 當然, -1只是一個例子。 如果您需要-1為有效值,則只需設置默認的Integer.MIN_VALUE之類的值即可。

捕獲錯誤是首選方法,即parseIntSafelyWithCatch() 您也可以使用提取方法parseIntSafelyWithExtraction()例如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);
String number = bookNumber.getText().trim();

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

最可能的問題是數字前后的空白字符。 將代碼更改為此:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM