Pregunta

When I try to run this bit of code that I wrote:

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;
        }
    }

The following is displayed on the console:

   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)

Adding lines so that my post can be submitted. Adding lines so that my post can be submitted. Adding lines so that my post can be submitted. Adding lines so that my post can be submitted.

¿Fue útil?

Solución 2

You do not want to open a new scanner and close it each time. Instead, just create it once. I also fixed two other bugs in your code.

  1. You were using nextInt() to read a double. This has been replaced with nextDouble().
  2. You are asking the user to input mass multiple times. This has been fixed by caching the value of mass, so it is read from the user only once.

Here is the corrected code.

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;
    }
}

Otros consejos

There is only one underlying InputStream used for Scanner so don't close it - doing so closes it for all future instances of the class making it impossible to read from the source

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top