“bootlean go = true”之后java程序有错误吗?

时间:2015-11-14 22:01:49

标签: java loops

我得到了一个例外:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)
    at package1.smth.main(clas1.java:19)

当我删除while(go)部分时,一切正常。但我添加它是为了能够重置程序,现在有一个例外。我还有另一个类似程序的代码,我添加了相同的循环,它没有这个例外 有人能解释一下这是什么问题吗?

public static void main(String[] args) {
    boolean go = true;
    while (go) {
        Scanner input = new Scanner(System.in);
        double a = 0;
        double b = 0;
        double c = 0;
        double discriminant = 0;
        double d = 0;
        System.out.print("Enter a : ");
        a = input.nextDouble();
        System.out.print("Enter b : ");
        b = input.nextDouble();
        System.out.print("Enter c : ");
        c = input.nextDouble();
        discriminant = (b * b - 4 * a * c);
        d = Math.sqrt(discriminant);
        if (discriminant >= 0.0) {
            System.out.println("first answer : " + (-b + d) / (2.0 * a));
            System.out.println("second answer : " + (-b - d) / (2.0 * a));
        } else if (discriminant == 0.0) {
            System.out.println("first answer : " + (-b) / (2.0 * a));
            System.out.println("second answer : " + (-b) / (2.0 * a));
        } else {
            System.out.println("no asnwers.");
            input.close();
        }
    }
}

我已经阅读了与我的问题类似的所有内容,大多数答案来自此网站。我尝试为我的代码实现给定的解决方案,有些不起作用,有些我无法理解如何使用,因为我的代码与问题中的示例不同。我是新手,这可能是我写的第三个节目。

更新 我的最终代码。它显示的唯一问题是“泄漏:扫描仪未关闭”

package gg;

import java.util.Scanner;

public class hbh {

    public static void main(String[] args) {
        boolean go = true;
        while (go) {
            Scanner input = new Scanner(System.in);
            double a = 0;
            double b = 0;
            double c = 0;
            double discriminant = 0;
            double d = 0;

            System.out.print("Enter a: "); 
            a = input.nextDouble(); 

            System.out.print("Enter b: "); 
            b = input.nextDouble();

            System.out.print("Enter c: "); 
            c = input.nextDouble();

            discriminant = (b * b - 4 * a * c);

            d = Math.sqrt(discriminant);
            if (discriminant >= 0.0) {
                System.out.println("First answer: " + (-b + d) / (2.0*a));
                System.out.println("Second answer: " + (-b - d) / (2.0*a));
            } 
            else if (discriminant ==0.0) {
                System.out.println("First answer: " + (-b) / (2.0*a));
                System.out.println("Second answer: " + (-b) / (2.0*a));
            }
            else {
                System.out.println("No answers");
                input.nextLine(); 
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你应该删除

input.close();

关闭System.in一次后,关闭它后就无法再次使用它。

我找不到来源,但这是证明这是导致问题的原因。

尝试运行以下代码,您将获得完全相同的异常。

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    input.close();
    Scanner other = new Scanner(System.in);
    other.nextDouble();
}

答案 1 :(得分:0)

当您致电numpy.array时,它不仅会关闭您的扫描仪,还会关闭您的input.close()。现在,即使关闭扫描仪(并保持扫描值),您仍然会继续迭代循环,这会导致激发。

<强>更新

你的代码似乎进入了一个无限循环,因为你没有从循环中断,也没有更新System.in的值,这在某些时候可能会终止循环。

因此,go将继续读取值,直到所有输入都用尽并最终抛出scanner异常(当所有输入都用完时)。