#java #return-value #static-members
#java #возвращаемое значение #статические члены
Вопрос:
Вот мой простой код для целей тестирования.
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
}
}
Я получаю сообщение об ошибке:
Этот метод должен возвращать результат типа boolean
Хотя в любой момент времени он должен либо возвращать true, либо false, но никогда не возвращает оба варианта. Кроме того, независимо от того, что я делаю, Eclipse говорит мне
Невозможно создать статическую ссылку на нестатическое поле bikeSpeed
для
void speedUp(){
bikeSpeed ;
}
с bikeSpeed
int bikeSpeed = 2;
Вероятно, простой ответ, но может ли кто-нибудь помочь? Я знаю, как использовать логические значения и тому подобное, и у меня никогда не было проблем, но самая простая вещь ^^^ не работает.
РЕДАКТИРОВАТЬ: вот мое ускорение:
void speedUp(){
bikeSpeed ;
}
И вот как я его использую:
System.out.println("Simple if amp;amp; if-then-else testing.");
if (isMoving == true) {
System.err.println("You're already moving fast, no need to speed up!");
} else {
speedUp();
System.out.println("Time to speed up!");
}
ОТРЕДАКТИРУЙТЕ ЕЩЕ РАЗ: объявление isMoving и тому подобное теперь в порядке, но строка
if (isMoving == true) {
выдает ошибку: isMoving не может быть преобразован в переменную. То же самое делает isMoving(), если я переключу его на это.
Последняя ошибка заключается в следующем
SpeedUp();
дает: невозможно создать статическую ссылку на нестатический метод SpeedUp() из типа HelloWorld
РЕДАКТИРОВАТЬ В прошлый РАЗ: я ненавижу это исправление, поскольку оно мне кажется неправильным, но eclipse, похоже, считает, что статическое изменение КАЖДОЙ ОТДЕЛЬНОЙ ПЕРЕМЕННОЙ исправляет ее (что оно и сделало), даже если оно не использовалось статически.
Комментарии:
1. вы уверены
speedUp()
, что не объявлен статическим? вы уверены, что отображается ошибкаspeedUp()
?2. можете ли вы вставить весь класс?
3. Мой код для ускорения таков. ‘code’ void SpeedUp(){ bikeSpeed ; } } ‘/code’ и я использую его так: ‘code’ if (isMoving == true) { System.err.println(«Вы и так быстро двигаетесь, ускоряться не нужно!»); } else {SpeedUp(); System.out.println(«Время ускоряться!»); } ‘/code’
4. @Java: пожалуйста, отредактируйте это в вопросе.
Ответ №1:
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
}
}
Компилятор здесь не обнаруживает, что одна из этих двух ветвей должна быть поражена, и поэтому он считает, что существует возможное состояние, при котором вы доберетесь до конца метода без указания возвращаемого значения. Вы можете использовать else
вместо else if
или просто return a == b
.
Это не просто недостаток компилятора; у вас может быть сценарий, в котором другой поток изменяет значения a
и b
в фоновом режиме, и в зависимости от времени оба этих условия могут быть ложными при их вычислении.
Комментарии:
1. или уменьшите его до
boolean isMoving() { return a == b; }
2. @Philipp: Вы были очень быстры с этим комментарием; Я добавил его примерно через минуту после публикации 🙂
Ответ №2:
Это эквивалентно:
boolean isMoving(){
return a == b;
}
Eclipse жалуется, потому что считает, что не все пути выполнения являются handle . Попробуйте:
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
} else {
return //a is neither equal nor not equal to b???
}
}
Обратите внимание, что последняя ветвь на самом деле может никогда не произойти, потому что если a == b
условие не выполнено, то a != b
должно быть true.
Комментарии:
1. На самом деле, поскольку
a
иb
не являются локальными, вторая ветвь может фактически принять значение false и, следовательно, быть пропущена.
Ответ №3:
Для этого кода:
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
}
}
Как компилятор может надежно определить, что ваши if
утверждения дополняют друг друга? В конце концов, не мог ли другой поток (теоретически) изменить значение a
or b
? Тогда у вас может быть случай, когда вы не возвращаете значение.
Просто укажите else
(и в этом случае используйте это вместо else if
):
boolean isMoving(){
if (a == b) {
return true;
} else {
return false;
}
}
Вы также можете полагаться на то, что первый return
предотвратит выполнение остальной части кода:
boolean isMoving(){
if (a == b) {
return true;
}
return false;
}
Ответ №4:
для первого фрагмента кода вы можете просто сделать
boolean isMoving(){
if (a == b) {
return true;
} else {
return false;
}
}
или даже
boolean isMoving(){
return a == b;
}
в вашем исходном коде компилятор Java не может быть уверен, что введено какое-либо условие if, поэтому он выдает ошибку, когда не может найти возврат в конце
вы также можете поставить assert false;
или throw new RuntimeException();
в конце, но в данном случае это не нужно
Ответ №5:
Вы могли бы упростить свой код до
return a == b
но причина, по которой он жалуется, заключается в том, что ваш код эквивалентен
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
} else {
//oh no, nothing there!
}
}
Статическая ссылка означает, что вы обращаетесь к полю класса откуда-то, у вас нет экземпляра класса. Вы могли бы получить доступ к этому полю из вашего основного метода, который является статическим, без использования экземпляра класса вместо этого.
Ответ №6:
Да, есть случай, когда компилятор не может сказать, что вы никогда не дойдете до конца блока. В качестве альтернативы вы могли бы просто поставить return false; перед закрывающей фигурной скобкой.
Ответ №7:
Для вашей первой проблемы измените свой код следующим образом:
return a == b;
Что касается вашей второй проблемы, есть ли в вашем коде конфликт имен? Если вы используете:
void speedUp(){
this.bikeSpeed ;
}
вместо этого это устраняет вашу проблему? Если да, то у вас есть две переменные с одинаковым именем, чего вы не должны делать.
Ответ №8:
Первая проблема немного раздражает (но для этого есть причина — многопоточность), компилятор java видит, что не все базы охвачены, исправление:
boolean isMoving(){
if (a == b) {
return true;
}
return false;
}
во-вторых, вам нужно сослаться на объект:
void speedUp(){
this.bikeSpeed ;
}
Редактировать:
Добавлена информация о многопоточности.
Похоже, статические проблемы, которые у вас есть, находятся в основном блоке кода, поскольку основной метод статичен, вы не можете ссылаться на переменные объекта, вам нужно сначала создать экземпляр объекта, а затем ссылаться на переменные этого объекта.
Комментарии:
1. Вы не можете гарантировать, что все базы будут покрыты, как только вы введете возможность многопоточности. 🙂