我该如何运行这个程序?

时间:2017-01-20 16:46:13

标签: java exception java.util.scanner

我的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的抽象类。 星期一,请帮助我做一个非常重要的考试 利玛

1 个答案:

答案 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);
}