使用 integer.parseInt java 时出现数字格式异常
number format exception when using integer.parseInt java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class reader {
public static void main(String[] args) {
char rbracket=')';
char lbracket='(';
char rsbracket=']';
char lsbracket='[';
String delimiter="\D";
String[] ar;
char start = 0,end=0;
int x[]=new int[2];
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)))
{
String c=reader.readLine();
for(int i=0;i<c.length();i++)
{
if(c.charAt(i)==rbracket)start=rbracket;
else if (c.charAt(i)==rsbracket)start=rsbracket;
else if(c.charAt(i)==lbracket)end=lbracket;
else if(c.charAt(i)==lsbracket)end=lsbracket;
}
ar=c.split(delimiter);
System.out.println(start);
System.out.println(end);
for(int i=0;i<ar.length;i++)
{
x[i]=Integer.parseInt(ar[i].trim());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我正在尝试读取这种格式的输入 (90,100)
,我需要读取括号和里面的范围。检查括号是否为 (
[
然后为数字 (=exclusive
和 [=inclusive
内的数字设置最小和最大范围。我正在尝试读取大括号的字符串检查,然后将字符串拆分为数字并保存为整数字符串以供使用。
然而,在拆分后出现数字格式异常,我无法将字符串转换为整数字符串。求助,哪里错了?
虽然您正在找出输入中使用的括号类型,但您并没有从字符串中删除它们。因此,当您拆分字符串时,您将获得两个数字,但也有括号。 Integer.parseInt
不会解析括号,所以这是您的错误来源。
如果您再次遇到类似情况,请尝试打印出不同的变量 - 这是检查变量值是否如您所想的最简单方法。
行ar=c.split(delimiter);
returns如下数组(输入"(90,100)"
):
["", "90", "100"]
所以第一个 Integer.parseInt
调用失败了。
更好的解决方案可能是使用正则表达式来解析和验证输入并提取数字:
String c = "(90,100)";
int[] x = new int[2];
Pattern p = Pattern.compile("([(\[])(\d+),(\d+)([)\]])");
Matcher m = p.matcher(c);
if (!m.matches()) {
// input is invalid
System.out.println("Bad input string: " + c);
} else {
// input is valid
char start = m.group(1).charAt(0);
char stop = m.group(4).charAt(0);
x[0] = Integer.parseInt(m.group(2));
x[1] = Integer.parseInt(m.group(3));
for (int y : x) {
System.out.println(y);
}
}
正则表达式的解释:
([(\[])
表示匹配 (
或 [
字符;外括号定义了一个 capture group, which is a subset of the matched string that we can retrieve using m.group(1)
(1
as it's the first group in the regex). Note that the third character here (i.e., the second '(') doesn't need to be escaped with \ because it is not counted as a special character when used inside a custom character class.
(\d+)
匹配一位或多位数字;括号定义了我们可以使用 m.group(2)
检索的第二个捕获组
,
匹配逗号
(\d+)
匹配一位或多位数字;括号定义了我们可以使用 m.group(3)
检索的第三个捕获组
([)\]])
匹配 )
或 ]
字符;外括号定义了我们的第四个捕获组,我们可以使用 m.group(3)
检索它
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class reader {
public static void main(String[] args) {
char rbracket=')';
char lbracket='(';
char rsbracket=']';
char lsbracket='[';
String delimiter="\D";
String[] ar;
char start = 0,end=0;
int x[]=new int[2];
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)))
{
String c=reader.readLine();
for(int i=0;i<c.length();i++)
{
if(c.charAt(i)==rbracket)start=rbracket;
else if (c.charAt(i)==rsbracket)start=rsbracket;
else if(c.charAt(i)==lbracket)end=lbracket;
else if(c.charAt(i)==lsbracket)end=lsbracket;
}
ar=c.split(delimiter);
System.out.println(start);
System.out.println(end);
for(int i=0;i<ar.length;i++)
{
x[i]=Integer.parseInt(ar[i].trim());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我正在尝试读取这种格式的输入 (90,100)
,我需要读取括号和里面的范围。检查括号是否为 (
[
然后为数字 (=exclusive
和 [=inclusive
内的数字设置最小和最大范围。我正在尝试读取大括号的字符串检查,然后将字符串拆分为数字并保存为整数字符串以供使用。
然而,在拆分后出现数字格式异常,我无法将字符串转换为整数字符串。求助,哪里错了?
虽然您正在找出输入中使用的括号类型,但您并没有从字符串中删除它们。因此,当您拆分字符串时,您将获得两个数字,但也有括号。 Integer.parseInt
不会解析括号,所以这是您的错误来源。
如果您再次遇到类似情况,请尝试打印出不同的变量 - 这是检查变量值是否如您所想的最简单方法。
行ar=c.split(delimiter);
returns如下数组(输入"(90,100)"
):
["", "90", "100"]
所以第一个 Integer.parseInt
调用失败了。
更好的解决方案可能是使用正则表达式来解析和验证输入并提取数字:
String c = "(90,100)";
int[] x = new int[2];
Pattern p = Pattern.compile("([(\[])(\d+),(\d+)([)\]])");
Matcher m = p.matcher(c);
if (!m.matches()) {
// input is invalid
System.out.println("Bad input string: " + c);
} else {
// input is valid
char start = m.group(1).charAt(0);
char stop = m.group(4).charAt(0);
x[0] = Integer.parseInt(m.group(2));
x[1] = Integer.parseInt(m.group(3));
for (int y : x) {
System.out.println(y);
}
}
正则表达式的解释:
([(\[])
表示匹配(
或[
字符;外括号定义了一个 capture group, which is a subset of the matched string that we can retrieve usingm.group(1)
(1
as it's the first group in the regex). Note that the third character here (i.e., the second '(') doesn't need to be escaped with \ because it is not counted as a special character when used inside a custom character class.(\d+)
匹配一位或多位数字;括号定义了我们可以使用m.group(2)
检索的第二个捕获组
,
匹配逗号(\d+)
匹配一位或多位数字;括号定义了我们可以使用m.group(3)
检索的第三个捕获组
([)\]])
匹配)
或]
字符;外括号定义了我们的第四个捕获组,我们可以使用m.group(3)
检索它