Две вещи: Eclipse говорит «должно быть статичным» для ВСЕГО! и этот метод должен возвращать результат типа boolean, в то время как он возвращает true

#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. Вы не можете гарантировать, что все базы будут покрыты, как только вы введете возможность многопоточности. 🙂