Newby: учебник по Java, ошибки при попытке вычислить целое число ?! Помогите, пожалуйста

1

это делает мою голову так плохо. Я новичок, пытающийся создать свою собственную базовую программу, основанную на учебнике по java, но с некоторыми дополнительными вычислениями, и я не могу понять, что не так.

В коде нет ошибок, только получаю сообщение об ошибке, когда я пытаюсь запустить его. Я просто хочу примерить расстояние от шара для гольфа и рассчитать скорость в секунду в зависимости от времени. Это просто для моего обучения. Но я получаю эту ошибку

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at GolfBall.<init>(GolfBall.java:23)
    at GolfCalc.main(GolfCalc.java:6)

По какой-то причине он считывает мою "минута" и "вторую" как ноль, когда пытается ее вычислить, даже если они были присвоены значениям "playerA.timeSecond(28)"; и т.п. Если я удалю код, в котором он вычисляет, и просто "System.out.println (минута +"/"+ вторая"), чтобы попробовать и отладить то, что происходит, он отлично считывает и отображает правильные значения. Только когда он пытается вычислить его, он получает ошибку... Я не понимаю, что происходит не так.

* обратите внимание, если я изменяю только "int minute = 0; до 'int minute = 1; он будет работать, но значение будет печататься как 0 после вычисления !?

Мой код:

class GolfBall {

    //Instantiating as integers
    int distance = 0;
    int minute = 0;
    int second = 0;


    void travel(int newValue) {
        distance = newValue;
    }

    void timeMin(int newValue){
        minute = newValue;
    }

    void timeSecond(int newValue){
        second = newValue;
    }


    int time = (60 / minute) + second; // To calculate total time into seconds
    double speed = distance / time;  //double as the result will be a decimal

    void printStates(){
        System.out.println("Distance: " + distance 
                + " Speed: " + speed +" Metres per second");
    }

}

И основной класс, где я присвоил значения и такие:

public class GolfCalc {

    public static void main(String[] args){


    GolfBall playerA = new GolfBall();
    GolfBall playerB = new GolfBall();

    playerA.travel(423); // My assigned values
    playerA.timeMin(1);
    playerA.timeSecond(28);
    playerA.printStates();

    playerB.travel(397);
    playerB.timeMin(1);
    playerB.timeSecond(13);
    playerB.printStates ();

   }

}

Любая помощь будет замечательной!

спасибо

  • 0
    В течение int time = (60 / minute) + second; не должно ли это быть * вместо / ?
  • 1
    Можете ли вы исправить свой код, пожалуйста? строки, начинающиеся с int time = (60 / мин) ... находятся за пределами метода.
Показать ещё 6 комментариев
Теги:

7 ответов

5
Лучший ответ

Вы делите на 0 в этой строке

int time = (60 / minute) + second;

Эта строка выполняется в тот момент, когда вы создаете объект GolfBall, и в это время minute все равно 0.

РЕДАКТИРОВАТЬ:

Вы можете решить эту проблему, переместив две строки в метод void printState() следующим образом:

void printStates(){
    int time = (60 / minute) + second; // To calculate total time into seconds
    double speed = distance / time;  //double as the result will be a decimal
    System.out.println("Distance: " + distance 
            + " Speed: " + speed +" Metres per second");
}

Это гарантирует, что код выполняется только при вызове метода. В предыдущем сценарии код выполнялся в тот же момент строк int minute = 0; и int second = 0; были выполнены.

  • 0
    Как я могу выполнить это после того, как я назначил это значение?
  • 0
    или просто не может использовать целое число, что-то еще?
Показать ещё 1 комментарий
4

Просто переместите вычисления в свой метод printStates и удалите поля класса:

void printStates(){
    int time = (60 / minute) + second; // To calculate total time into seconds
    double speed = distance / time;  //double as the result will be a decimal
    System.out.println("Distance: " + distance 
            + " Speed: " + speed +" Metres per second");
}

Ваш текущий код выполняет расчет только один раз, когда GolfBall класс GolfBall.

2

Проблема здесь:

int time = (60 / minute) + second; // To calculate total time into seconds

Дело в том, что это оценивается при GolfBall объекта GolfBall. minute и second инициализируются до 0, так как все поля классов, и поэтому вы получаете деление на 0.

Это может сделать немного более четким, чтобы изменить ваши поля. Код здесь эквивалентен вашему исходному коду:

class GolfBall {

    //Instantiating as integers
    int distance = 0;
    int minute = 0;
    int second = 0;
    int time = (60 / minute) + second; // To calculate total time into seconds
    double speed = distance / time;  //double as the result will be a decimal

    // methods follow...
}

Теперь вы видите, откуда происходит деление на 0? Тот факт, что вы вызываете timeMin() не имеет значения, потому что вы timeMin() на 0 до того, как экземпляр объекта даже закончится!


Один из способов решения этого - установить time и speed на 0 и пересчитать каждый раз, когда вы устанавливаете distance, minute или second. Кроме того, вы можете просто вычислить непосредственно в методе printStates().

  • 0
    Спасибо, я не понял, что int сразу же устанавливается в 0, когда он запускает код, я попробую в Println, спасибо
0
int time = (60 / minute) + second; // To calculate total time into seconds
    double speed = distance / time;  //double as the result will be a decimal

в этой строке кода вы не можете делить 60 за минуту... (что, если минута равна 0)

поэтому вы получите → Exception in thread "main" java.lang.ArithmeticException: /by zero

сделать ниже переменных 1

   int distance = 0;
        int minute = 0;
        int second = 0;
  • 0
    Я думал, что мог бы присвоить ему значение, а затем выполнить его, но кажется, что он выполняется сразу.
  • 0
    да скорее всего. если это не создает никаких проблем для вашего кода, приравнивает их к одному
0
 int time = (60 / minute) + second; // To calculate total time into seconds
 double speed = distance / time;  //double as the result will be a decimal

В вашем случае вычисление выполняется в конструкторе, где все вавилеры инициализируются 0. Сделайте следующее:

class GolfBall {

    //Instantiating as integers
    int distance = 0;
    int minute = 0;
    int second = 0;

int time = 0;
double speed = 0;


    void travel(int newValue) {
        distance = newValue;
    }

    void timeMin(int newValue){
        minute = newValue;
    }

    void timeSecond(int newValue){
        second = newValue;
    }

public void calc(){
time = (60 / minute) + second; // To calculate total time into seconds
    speed = distance / time;  //double as the result will be a decimal
}

    void printStates(){
        System.out.println("Distance: " + distance 
                + " Speed: " + speed +" Metres per second");
    }

    }

Класс GolfCalc:

public class GolfCalc {

        public static void main(String[] args){

    GolfBall playerA = new GolfBall();
    GolfBall playerB = new GolfBall();

    playerA.travel(423); // My assigned values
    playerA.timeMin(1);
    playerA.timeSecond(28);
    playerA.calc();
    playerA.printStates();

    playerB.travel(397);
    playerB.timeMin(1);
    playerB.timeSecond(13);
    playerB.calc();
    playerB.printStates ();

   }

}
0

Эта часть кода:

int time = (60 / minute) + second; // To calculate total time into seconds
double speed = distance / time;  //double as the result will be a decimal

выполняется при создании экземпляра объекта GolfBall.

Вы shoud поместите этот код в метод и вызовите его после выполнения cal travel(), timeMin() и timeSecond()

0

Это довольно странный учебник с этим соглашением об именах, которое вы используете...

public class GolfBall 
{

    //Instantiating as integers
    int distance = 0;
    int minute = 0;
    int second = 0;


    public void setDistance(int newValue) 
    {
        distance = newValue;
    }

    public void setMinute(int newValue)
    {
        minute = newValue;
    }

    public void setSecond(int newValue)
    {
        second = newValue;
    }

    public void printStates()
    {
        int time = (60 * minute) + second; // To calculate total time into seconds
        double speed = distance / time;  //double as the result will be a decimal

        System.out.println("Distance: " + distance 
                + " Speed: " + speed +" Metres per second");
    }
}

А также

public class GolfCalc 
{
    public static void main(String[] args)
    {
        GolfBall playerA = new GolfBall();
        GolfBall playerB = new GolfBall();

        playerA.setDistance(423); // My assigned values
        playerA.setMinute(1);
        playerA.setSecond(28);
        playerA.printStates();

        playerB.setDistance(397);
        playerB.setMinute(1);
        playerB.setSecond(13);
        playerB.printStates();
   }
}
  • 0
    Хотя технически вы все равно получите арифметическое деление на ноль исключений, если минута и секунда равны нулю.
  • 0
    Ну, я знал здесь, я не уверен. Я имел в виду, что это было основано на Tutroial
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню