Integer.parseInt 失败 'For input string: "5000"'
Integer.parseInt failing 'For input string: "5000"'
我承认,我很难过。这不是双打。它不在整数范围之外。这不是南。据我所知,它不是任何形状或形式的非整数。
为什么我会收到那个错误?
这是导致它的代码:
String filename = "confA.txt";
//Make a new filereader to read in confA
FileReader fileReader = new FileReader(filename);
//Wrap into a bufferedReader for sanity's sake
BufferedReader bufferedReader = new BufferedReader(fileReader);
//Get the port number that B is listening to
int portNum = Integer.parseInt(bufferedReader.readLine());
最后一行失败,说明:
java.lang.NumberFormatException: For input string: "5000"
我要哪个号码。
我也试过
Integer portNum = Integer.parseInt(bufferedReader.readLine());
但这也没有用。 valueOf().
也没有
很可能在您的文件行中某处有一些无法打印的字符。请考虑以下示例(已在 Java 9 jshell 中测试)
jshell> String value = "5000\u0007";
value ==> "5000[=10=]7"
jshell> Integer.parseInt(value);
| java.lang.NumberFormatException thrown: For input string: "5000"
| at NumberFormatException.forInputString (NumberFormatException.java:65)
| at Integer.parseInt (Integer.java:652)
| at Integer.parseInt (Integer.java:770)
| at (#15:1)
此处字符串末尾包含 "bell" 字符。当它没有打印在异常文本中时,它会使解析失败。我想你有类似的东西。验证这一点的最简单方法是检查
String line = bufferedReader.readLine();
System.out.println("line length: " + line.length());
4
以外的值会支持我的想法。
我遇到了同样的问题。我正在读取带有缓冲 reader 的平面文件并将内容保存为字符串类型的 ArrayList,但是在从列表中检索字符串值时执行 integer.parse 时,我意识到有一个从文件中读取的字符串中有很多垃圾,因为我得到了 java.lang.NumberFormatException.
这是我用代码实现的方法(从我的主要方法调用)来解决问题:
`
// class 级别
private static final Pattern numericPattern = Pattern.compile("([0-9]+).([\\.]{0,1}[0-9]*)");
// in main method after reading in the file
String b = stripNonNumeric(stringvaluefromfile);
int a = Integer.parseInt(b);
public static String stripNonNumeric(String number) {
//System.out.println(number);
if (number == null || number.isEmpty()) {
return "0";
}
Matcher matcher = numericPattern.matcher(number);
// strip out all non-numerics
StringBuffer sb = new StringBuffer("");
while (matcher.find()) {
sb.append(matcher.group());
}
// make sure there's only one dot
int prevDot = -1;
for (int i = sb.length() - 1; i >= 0; i--) {
if (sb.charAt(i) == '.') {
if (prevDot > 0) {
sb.deleteCharAt(prevDot);
}
prevDot = i;
}
}
if (sb.length() == 0) {
sb.append("0");
}
return sb.toString();
}`
我承认,我很难过。这不是双打。它不在整数范围之外。这不是南。据我所知,它不是任何形状或形式的非整数。
为什么我会收到那个错误?
这是导致它的代码:
String filename = "confA.txt";
//Make a new filereader to read in confA
FileReader fileReader = new FileReader(filename);
//Wrap into a bufferedReader for sanity's sake
BufferedReader bufferedReader = new BufferedReader(fileReader);
//Get the port number that B is listening to
int portNum = Integer.parseInt(bufferedReader.readLine());
最后一行失败,说明:
java.lang.NumberFormatException: For input string: "5000"
我要哪个号码。
我也试过
Integer portNum = Integer.parseInt(bufferedReader.readLine());
但这也没有用。 valueOf().
很可能在您的文件行中某处有一些无法打印的字符。请考虑以下示例(已在 Java 9 jshell 中测试)
jshell> String value = "5000\u0007";
value ==> "5000[=10=]7"
jshell> Integer.parseInt(value);
| java.lang.NumberFormatException thrown: For input string: "5000"
| at NumberFormatException.forInputString (NumberFormatException.java:65)
| at Integer.parseInt (Integer.java:652)
| at Integer.parseInt (Integer.java:770)
| at (#15:1)
此处字符串末尾包含 "bell" 字符。当它没有打印在异常文本中时,它会使解析失败。我想你有类似的东西。验证这一点的最简单方法是检查
String line = bufferedReader.readLine();
System.out.println("line length: " + line.length());
4
以外的值会支持我的想法。
我遇到了同样的问题。我正在读取带有缓冲 reader 的平面文件并将内容保存为字符串类型的 ArrayList,但是在从列表中检索字符串值时执行 integer.parse 时,我意识到有一个从文件中读取的字符串中有很多垃圾,因为我得到了 java.lang.NumberFormatException.
这是我用代码实现的方法(从我的主要方法调用)来解决问题:
` // class 级别
private static final Pattern numericPattern = Pattern.compile("([0-9]+).([\\.]{0,1}[0-9]*)");
// in main method after reading in the file
String b = stripNonNumeric(stringvaluefromfile);
int a = Integer.parseInt(b);
public static String stripNonNumeric(String number) {
//System.out.println(number);
if (number == null || number.isEmpty()) {
return "0";
}
Matcher matcher = numericPattern.matcher(number);
// strip out all non-numerics
StringBuffer sb = new StringBuffer("");
while (matcher.find()) {
sb.append(matcher.group());
}
// make sure there's only one dot
int prevDot = -1;
for (int i = sb.length() - 1; i >= 0; i--) {
if (sb.charAt(i) == '.') {
if (prevDot > 0) {
sb.deleteCharAt(prevDot);
}
prevDot = i;
}
}
if (sb.length() == 0) {
sb.append("0");
}
return sb.toString();
}`