это делает мою голову так плохо. Я новичок, пытающийся создать свою собственную базовую программу, основанную на учебнике по 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;
Эта строка выполняется в тот момент, когда вы создаете объект 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;
были выполнены.
Просто переместите вычисления в свой метод 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
.
Проблема здесь:
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()
.
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;
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 ();
}
}
Эта часть кода:
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()
Это довольно странный учебник с этим соглашением об именах, которое вы используете...
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();
}
}
int time = (60 / minute) + second;
не должно ли это быть*
вместо/
?