我的java编译器有一个奇怪的问题。我和我的朋友做了一个程序(他用电子邮件发给我程序,问题是一样的),并且在他的电脑上运行我的电脑不运行。我尝试在stackoverflow上找到所有可能的解决方案,我做了我读过的所有内容,但似乎没有解决方案,我也重新安装了不同版本的java但不运行。 问题如下:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at Geometriche.main(Geometriche.java:13)
该计划如下:
import java.util.*;
import java.io.*;
public class Geometriche{
public static void main (String [] arg)throws Exception{
Scanner sc = new Scanner(System.in);
double area = 0,a = 0;
int x = sc.nextInt();
Figura F[] = new Figura[x];
sc.nextLine();
for(int i=0; i<x; i++){
while(sc.hasNextLine()){
char s = sc.next().charAt(0);
switch(s){
case 'r':
double b = sc.nextDouble();
double al = sc.nextDouble();
F[i] = new Rettangolo(b,al);
a = F[i].getArea();
break;
case 'c':
double raggio = sc.nextDouble();
F[i] = new Cerchio(raggio);
a = F[i].getArea();
break;
case 't':
double lato1 = sc.nextDouble();
double lato2 = sc.nextDouble();
double lato3 = sc.nextDouble();
F[i] = new Triangolo(lato1,lato2,lato3);
a = F[i].getArea();
break;
case 'q':
double l = sc.nextDouble();
F[i] = new Quadrato(l);
a = F[i].getArea();
break;
}
area = area + a;
}
}
System.out.println("La somma delle aree e': "+area);
}
}
还有4个不同的类代表4个不同的几何图形(recthangle,circle,triangle,square)和一个名为figura的抽象类。 星期一,请帮助我做一个非常重要的考试 利玛
答案 0 :(得分:1)
由于文件末尾的最后一个换行符,您的代码会抛出异常。我尝试使用您提供的输入创建的文件代码,输出是预期的,没有异常抛出。我在文件的末尾添加了一个换行符,如果我们按字符逐个查看它,我们会看到类似这样的内容:
3 \ NT \ N9 \ N12 \ N15 \ NC \ N5 \ NQ \ N5 \ n
最后一个换行符是异常的原因,因为你在while(sc.hasNextLine())
上也读它,但是后面没有元素,因此是NoSuchElementException
,当它被抛出时我改变了文件。
你的朋友设法使这段代码工作,因为他可能没有包含最后一个换行符(输入5后他没有按下ENTER键)。
解决方法是删除while,因为没有理由你还没有它,因为你已经告诉forloop迭代了多少次,并且循环内部告诉Scanner在每个条件下读取多少。
下面的代码只会抛出一个NoSuchElementException
,如果你说你有一些数字并且没有在文件中描述它们(即输入3个数字并仅向其中2个提供信息)。
public static void main (String [] arg) throws Exception {
String path = "C:\\folder\\myfile.txt";
Scanner sc = new Scanner(Paths.get(path), StandardCharsets.UTF_8.name());
double area = 0, a = 0;
int x = sc.nextInt();
Figura F[] = new Figura[x];
sc.nextLine();
for (int i = 0; i < x; i++) {
char s = sc.next().charAt(0);
switch (s) {
case 'r':
double b = sc.nextDouble();
double al = sc.nextDouble();
F[i] = new Rettangolo(b, al);
a = F[i].getArea();
break;
case 'c':
double raggio = sc.nextDouble();
F[i] = new Cerchio(raggio);
a = F[i].getArea();
break;
case 't':
double lato1 = sc.nextDouble();
double lato2 = sc.nextDouble();
double lato3 = sc.nextDouble();
F[i] = new Triangolo(lato1, lato2, lato3);
a = F[i].getArea();
break;
case 'q':
double l = sc.nextDouble();
F[i] = new Quadrato(l);
a = F[i].getArea();
break;
}
area = area + a;
}
System.out.println("La somma delle aree e': "+area);
}