Integer.parseInt 有时有 NumberFormatException
Integer.parseInt sometimes has NumberFormatException
我有一个程序,用户在 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());
最有可能的问题是数字前后的空白字符。将您的代码更改为:
int i = Integer.parseInt(bookNumber.getText().trim());
在尝试解析它之前,我会添加一些逻辑来验证它是一个数字。由于原始整数不能为空,因此返回 -1
。您可以检查以查看处理后的值是否也有效。当然,-1
只是一个例子。如果你需要 -1
有效,只需设置默认的 Integer.MIN_VALUE
或其他东西。
捕获错误是首选方法,即 parseIntSafelyWithCatch()
。您还可以使用提取方法,即 parseIntSafelyWithExtraction()
作为避免异常处理的替代方法。
数字验证器
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
}
我有一个程序,用户在 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());
最有可能的问题是数字前后的空白字符。将您的代码更改为:
int i = Integer.parseInt(bookNumber.getText().trim());
在尝试解析它之前,我会添加一些逻辑来验证它是一个数字。由于原始整数不能为空,因此返回 -1
。您可以检查以查看处理后的值是否也有效。当然,-1
只是一个例子。如果你需要 -1
有效,只需设置默认的 Integer.MIN_VALUE
或其他东西。
捕获错误是首选方法,即 parseIntSafelyWithCatch()
。您还可以使用提取方法,即 parseIntSafelyWithExtraction()
作为避免异常处理的替代方法。
数字验证器
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
}