Java 读取时无接触异常。下一步使用扫描仪加倍

Java 读取时无接触异常。下一步使用扫描仪加倍,java,Java,我刚刚学了一些java,并试图制作一个简单的计算器。当我用扫描仪输入用户需要的总数时,它工作得很好。就是在我用另一台扫描仪来获取破解密码的数字时。它给了我这些错误: Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Unknown Source) at java.base/java.util.Scanner.next(Unkno

我刚刚学了一些java,并试图制作一个简单的计算器。当我用扫描仪输入用户需要的总数时,它工作得很好。就是在我用另一台扫描仪来获取破解密码的数字时。它给了我这些错误:

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextDouble(Unknown Source)
at test2.calculator2.input(calculator2.java:45)
at test2.calculator2.main(calculator2.java:128)
代码:

包测试2;
导入java.util.Scanner;
公共类计算器2{
公共静态int cNum,cOp;
公共静态双num[],tNums,输出;
公共静态字符串op[];
公共静态无效输入(){
布尔ISInputing,invalidTNum,invalidOp;
IsInputing=true;
invalidTNum=真;
无效=真;
cNum=1;
cOp=1;
扫描器tNumInput=新扫描器(System.in);
System.out.println(“请输入一个大于或等于2的数字”);
System.out.println(“您想要多少个数字?”);
tNums=tNumInput.nextDouble();
while(无效){
如果(tNums<2){
invalidTNum=真;
System.out.println(“请输入一个大于或等于2的数字”);
System.out.println(“您想要多少个数字?”);
tNums=tNumInput.nextDouble();
}否则{
无效=错误;
tNumInput.close();
}
}
num=新的双精度[(int)tNums];
op=新字符串[(int)tNums--];
System.out.println(“请输入号码”);
扫描器numInput=新扫描器(System.in);
41:num[cNum]=numInput.nextDouble();
cNum++;
while(正在输入){
如果(cNum>=tNums){
IsInputing=false;
}否则{
IsInputing=true;
}
while(无效){
System.out.printf(“请输入操作。(+,-,*,/)”;
扫描仪opInput=新扫描仪(System.in);
op[cOp]=opInput.nextLine();
开关(op[cOp]){
格“+”:
案例“-”:
案例“*”:
案例“/:
无效=假;
违约:
无效=真;
System.out.println(“您的操作无效”);
}
}
System.out.printf(“请输入数字”);
num[cNum]=numInput.nextDouble();
cOp++;
cNum++;
无效=真;
}
}
公共静态无效计数(){
布尔值isCounting=true;
双芒;
cNum=1;
cOp=1;
awnswer=num[cNum];
cNum++;
同时(计算){
如果(cNum>=tNums){
isCounting=错误;
}否则{
isCounting=正确;
}
开关(op[cOp]){
格“+”:
awnswer+=num[cNum];
打破
案例“-”:
awnswer-=num[cNum];
打破
案例“*”:
awnswer*=num[cNum];
打破
案例“/:
awnswer/=num[cNum];
打破
违约:
打破
}
cNum++;
cOp++;
}
输出=awnswer;
}
公共静态void main(字符串参数[]){
布尔重用=真;
while(重用){
128:输入();
计数();
系统输出打印项次(输出);
}
}
}

我只是想说,我才刚刚开始使用java,我真的很不擅长,所以请原谅我犯了一些愚蠢的错误。

调用
tNumInput.nextDouble()您应该检查扫描仪是否有元素。否则将导致此错误

 if(tNumInput.hasNext())
 tNumInput.next();

还要确保调用tNumInput.close()

您不应该创建多个
扫描仪的实例。相反,只需在开始时制作一个扫描仪,并在整个程序中重复使用该扫描仪

固定版本可能如下所示:

包测试2;
导入java.util.Scanner;
公共类计算器2{
公共静态int cNum,cOp;
公共静态双num[],tNums,输出;
公共静态字符串op[];
公共静态扫描仪;
公共静态无效输入(){
布尔ISInputing,invalidTNum,invalidOp;
IsInputing=true;
invalidTNum=真;
无效=真;
cNum=1;
cOp=1;
System.out.println(“请输入一个大于或等于2的数字”);
System.out.println(“您想要多少个数字?”);
tNums=scanner.nextDouble();
while(无效){
如果(tNums<2){
invalidTNum=真;
System.out.println(“请输入一个大于或等于2的数字”);
System.out.println(“您想要多少个数字?”);
tNums=scanner.nextDouble();
}否则{
无效=错误;
scanner.close();
}
}
num=新的双精度[(int)tNums];
op=新字符串[(int)tNums--];
System.out.println(“请输入号码”);
41:num[cNum]=scanner.nextDouble();
cNum++;
while(正在输入){
如果(cNum>=tNums){
IsInputing=false;
}否则{
IsInputing=true;
}
while(无效){
System.out.printf(“请输入操作。(+,-,*,/)”;
op[cOp]=scanner.nextLine();
开关(op[cOp]){
格“+”:
案例“-”:
案例“*”:
案例“/:
无效=假;
违约:
无效=真;
System.out.println(“您的操作无效”);
}
}
System.out.printf(“请输入数字”);
num[cNum]=scanner.nextDouble();
cOp++;
cNum++;
无效=真;
}
}
公共静态无效计数(){
布尔计数
 if(tNumInput.hasNext())
 tNumInput.next();
try (Scanner scan = new Scanner(System.in)) {
    scan.useLocale(Locale.US);
    // ...
}