例如,当您键入22和56时,此代码可以正常工作,它会显示正确的结果
import java.util.Scanner;
class apples{
public static void main(String args[]){
Scanner villy = new Scanner (System.in);
double fnum, snum, answer;
System.out.println("Enter first num: ");
fnum = villy.nextDouble();
System.out.println("Enter second num: ");
snum = villy.nextDouble();
answer = fnum + snum;
System.out.println(answer);
}
}
但是当你尝试将小数放在例如23.53和42.76时它失败并出现以下异常
Exception in thread "main": java.util.InputMismatchException
at java.util.Scanner.throwFor(unknown Source)
at java.util.Scanner.next(unknown Source)
at java.util.Scanner.nextDouble(unknown Source)
at apples.main(apples.java:8)
答案 0 :(得分:1)
查看您的例外的API说明。
由扫描程序抛出,表示检索到的令牌与预期类型的模式不匹配,或者令牌超出预期类型的范围
你可能没有投入你期望的输入;无论如何,扫描仪的“下一个”项目在某个时刻不是双倍的。
查看屏幕截图,您似乎正确使用了API。我怀疑Eclipse的内置控制台支持并不像扫描仪所期望的那样。尝试将方法的第一行更改为:
Scanner villy = new Scanner("23.53\n42.76\n");
这应该与您从输入流中获得的功能相同;如果这样可行则表明问题出在Eclipse的输入上。
要尝试的一件事,一般来说总是一个好主意,就是明确指定输入流的编码。您要发送的内容是字符,但您实际发送的是字节。如果Eclipse使用了一些不寻常的字符编码,并且默认情况下Scanner会猜到一个不同的编码,那么您将遇到问题。在扫描程序构造函数中指定实际编码将消除这种可能性。
另一个选择是Java运行的Locale实际上使用逗号作为小数分隔符。如果是这种情况,那么扫描仪是正确的,您没有正确指定双精度(虽然这也应该在基于字符串的示例上失败)。
答案 1 :(得分:1)
你是否有机会在非英语电脑上?例如,使用法语或德语语言环境,您必须输入23,53
,而不是23.53
。
Scanner的默认语言环境是Locale.getDefault()返回的内容:在英语计算机上,它应该返回Locale.ENGLISH
。您可以通过执行以下操作将语言环境设置为英语:
Scanner villy = new Scanner(System.in).useLocale(Locale.ENGLISH);
答案 2 :(得分:1)
输入数字时,您可能会输入逗号而不是句点。这将抛出InputMismatchException。我已经运行了代码,并且在正确输入类型的情况下工作正常,但是当我用其他任何字符替换句点时抛出InputMismatchException。
答案 3 :(得分:0)
以下代码段工作正常。你的问题必须在其他地方。 “失败”是什么意思?它会给你一个错误信息或例外吗?
double fnum=0, snum=0, answer = 0;
fnum=23.53;
snum=42.76;
answer=fnum+snum;
System.out.println("answer="+answer); //prints 66.28999999999999