我使用BufferedReader来读取用户的数据,但是它给出了NumberFormat Exception,我以某种方式给出了输入。假设在C中,我编写如下代码:
scanf("%d %d", &x, &y);
我试着像这样输入控制台: 23 45 ,它会分配如下值:
x = 23,y = 45
我怎样才能在java中做这样的事情。我试过这样:
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
String line1 = br1.readLine();
String line2 = br2.readLine();
int x = Integer.parseInt(line1);
int y = Integer.parseInt(line2);
但是这给了:
线程中的异常" main" java.lang.NumberFormatException:用于输入 string:" 23 45"在 java.lang.NumberFormatException.forInputString(未知来源)at java.lang.Integer.parseInt(未知来源)at AB.main上的java.lang.Integer.parseInt(未知来源)(AB.java:23)
答案 0 :(得分:1)
一个InputStreamReader就足够了:
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
String line1 = br1.readLine();
String[] args = line1.split(" ");
if (args.length != 2) {
throw new IllegalArgumentException("The input is wrong");
}
int x = getIntFromInput(args[0]);
int y = getIntFromInput(args[1]);
并且Jan指出你需要一个转换方法:
public static int getIntFromInput(String inputString) {
//sanity checks
if (inputString == null || inputString.trim().length() == 0) {
throw new IllegalArgumentException("empty or null string passed");
}
try {
return new BigInteger(inputString, 10).intValueExact();
} catch (Exception ignored) {
throw new IllegalArgumentException(String.format("input string is not a valid integer number: '%s'", inputString));
}
}
答案 1 :(得分:1)
如果你真的想要在同一行上传递两个参数,请在白色空格上分割线,然后分别使用每个标记:
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
String line1 = br1.readLine();
String[] tokens = line1.split("\\s+")
int x = Integer.parseInt(tokens[0]);
int y = Integer.parseInt(tokens[1]);
答案 2 :(得分:1)
readLine()
读取,直到有换行符,通常意味着用户按下了回车键。
如果你输入12 34,这是一行,一行不像整数那样格式化。
您可以使用read()
一次读取一个字符,手动拆分行并解析结果,或者最好使用Scanner
类。它有一个更面向用户IO的api,暴露了诸如nextInt()
或next()
之类的方法(返回下一个"令牌"而不是下一个char)等等。
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
答案 3 :(得分:1)
现在我们在这里 - 很多很多答案只是解释了如何阅读正确的输入。但是你会得到NumberFormatExceptions
任何其他奇怪的方式。就像你输入的那样......
98765432109876543210 9876543210987654321
这会反过来抛出NumberFormatException
,因为它们太大而无法容纳int
。
因此,虽然在" "
拆分并手动寻址令牌是一个很好的建议,但如果仅提供一个号码,您也会遇到ArrayIndexOutOfBounds
。< / p>
我的建议是在进行任何进一步解析之前检查输入是否有效:
Scanner s = new Scanner(System.in);
String line = s.nextLine();
Pattern p = Pattern.compile("(\\d{1,10})\\s+(\\d{1,10})");
Matcher m = p.matcher(line);
if(m.matches()) {
long x1 = Long.parseLong(m.group(1));
long y1 = Long.parseLong(m.group(2));
if(x1 <= Integer.MAX_VALUE&& y1 <= Integer.MAX_VALUE) {
int x = (int)x1;
int y = (int)y1;
System.out.printf("Your input: %d / %d", x, y);
} else {
System.err.println("Numbers too big");
}
} else {
System.err.println("Input does not match criteria");
}
答案 4 :(得分:0)
你必须做那样的事情:
String in = *getline*;
String[] tab = in.split(' ');
List<int> nums = new ArrayList<int>();
for(String a : tab){
nums.add(Integer.parseInt(a)); // or push() not remember...
}
// Your nums have your integers now
答案 5 :(得分:0)
这将解决您的目的
int x, y;
String[] input;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
input = str.split(" ");
x = Integer.parseInt(input[0]);
y = Integer.parseInt(input[1]);
答案 6 :(得分:0)
您可以根据1个或多个空格读取文件中的数据和拆分字符串,并且可以处理由空格分隔的多个输入。
Scanner s = new Scanner(System.in);
String line = s.nextLine();
//String line = "98765432109876543210 9876543210987654321 ";
String[] splited = line.split("\\s+");
然后比较每个字符串以检查它是否是有效数字。 然后从该数字创建一个新的BigDecimal。具有内存允许的64位jvm上的BigDecimal最多可以容纳646456993个数字。
for (int i=0;i<splited.length;i++) {
if(splited[i].matches("[0-9]*")){
BigDecimal num = new BigDecimal(splited[i]);
System.out.println("num "+(i+1)+"="+num);
}
}
Results
line ="98765432109876543210 9876543210987654321 "
num 1=98765432109876543210
num 2=9876543210987654321
line ="1212312312312312312312313 123432432432432423432423432"
num 1=1212312312312312312312313
num 2=123432432432432423432423432