Java Scanner抛出了一些我没见过的错误

时间:2014-04-09 21:39:08

标签: java runtime-error java.util.scanner

当我尝试运行我写的这段代码时:

import java.util.Scanner;
    public class F1Calc
    {
        public static void main(String args[])
        {
            System.out.println("The coefficient of friction of the " + getSurface() + " surface is " + getCoeff() + ".  The mass of the ball was " + getMass() + " and the momentum of the ball was "+ getMomentum() + " Nm.  The potential energy contained by the ball at the top of the .121 m high ramp was " + getPotEnergy() + " Joules.");
        }
        public static String getSurface()
        {
            Scanner kb = new Scanner(System.in);
            System.out.println("What is the surface you are rolling the ball into?");
            String surface = kb.nextLine();
            kb.close();
            return surface;
        }
        public static double getMass()
        {
            Scanner kb2 = new Scanner(System.in);
            System.out.println("What is the mass of the ball in kilograms?");
            double mass = kb2.nextInt();
            kb2.close();
            return mass;
        }
        public static double getPotEnergy()
        {
            double potEnergy = getMass() * .121 * 9.8;
            return potEnergy;
        }
        public static double getMomentum()
        {
            double doublePE = 2 * getPotEnergy();
            double doublePEOverMass = doublePE / getMass();
            double velocity = Math.sqrt(doublePEOverMass);
            double momentum = velocity * getMass();
            return momentum;
        }
        public static double getCoeff()
        {
            double coeff = getPotEnergy() / (getMass() * 9.8);
            return coeff;
        }
    }

控制台上显示以下内容:

   What is the surface you are rolling the ball into?
    Tile
    What is the mass of the ball in kilograms?
    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.nextInt(Unknown Source)
        at java.util.Scanner.nextInt(Unknown Source)
        at F1Calc.getMass(F1Calc.java:20)
        at F1Calc.getPotEnergy(F1Calc.java:26)
        at F1Calc.getCoeff(F1Calc.java:39)
        at F1Calc.main(F1Calc.java:6)

请指教。

2 个答案:

答案 0 :(得分:2)

只有一个基础InputStream用于扫描程序,所以不要关闭它 - 这样做会关闭它以便将来所有类的实例无法从源中读取

答案 1 :(得分:0)

您不想每次打开新扫描仪并关闭它。相反,只需创建一次。 我还修复了代码中的其他两个错误。

  1. 您使用nextInt()阅读double。该内容已替换为nextDouble()
  2. 您要求用户多次输入mass。这已通过缓存mass的值来修复,因此只能从用户读取一次。
  3. 这是更正后的代码。

    import java.util.Scanner;
    public class F1Calc
    {
        // Cache the values so we don't have to keep bugging the user
        static double mass;
    
        static Scanner kb;
        public static void main(String args[])
        {
            mass = -1;
            kb = new Scanner(System.in);
            System.out.println("The coefficient of friction of the " + getSurface() + " surface is " + getCoeff() + ".  The mass of the ball was " + getMass() + " and the momentum of the ball was "+ getMomentum() + " Nm.  The potential energy contained by the ball at the top of the .121 m high ramp was " + getPotEnergy() + " Joules.");
        }
        public static String getSurface()
        {
            System.out.println("What is the surface you are rolling the ball into?");
            String surface = kb.nextLine();
            return surface;
        }
        public static double getMass()
        {
            if (mass > 0) return mass;
    
            System.out.println("What is the mass of the ball in kilograms?");
            mass = kb.nextDouble();
            return mass;
        }
        public static double getPotEnergy()
        {
            double potEnergy = getMass() * .121 * 9.8;
            return potEnergy;
        }
        public static double getMomentum()
        {
            double doublePE = 2 * getPotEnergy();
            double doublePEOverMass = doublePE / getMass();
            double velocity = Math.sqrt(doublePEOverMass);
            double momentum = velocity * getMass();
            return momentum;
        }
        public static double getCoeff()
        {
            double coeff = getPotEnergy() / (getMass() * 9.8);
            return coeff;
        }
    }