Как использовать это логическое выражение в выражении if?

private String getWhoozitYs(){ StringBuffer sb = new StringBuffer(); boolean stop = generator.nextBoolean(); if(stop = true) { sb.append("y"); getWhoozitYs(); } return sb.toString(); } 

Это кусок кода для проекта, который я делаю в курсе программирования. Проблема, с которой я сталкиваюсь, заключается в том, что после объявления логической остановки и попытки присвоить ей случайно генерируемое логическое значение, я не могу использовать ее в выражении if, чтобы определить, должен ли я добавить больше y к StringBuffer или нет. У меня есть генератор случайных чисел внутри конструктора, так что эта часть не является проблемой. Я предположил, что, поскольку я объявил логическое значение вне выражения if, я мог бы использовать его внутри, но это, похоже, не так. Реальный вопрос заключается в том, как я могу использовать произвольно определенное логическое выражение в выражении if.

if(stop = true) должно быть, if(stop == true) или просто (лучше!), if(stop) .

На самом деле это хорошая возможность увидеть причину, почему всегда использовать if(something) если вы хотите увидеть, является ли это true вместо того, чтобы писать if(something == true) (плохой стиль!).

Делая stop = true вы назначаете true для stop а не для сравнения.

Итак, почему выполняется код ниже инструкции if ?

См. JLS – 15.26. Операторы присваивания :

Во время выполнения результатом выражения присваивания является значение переменной после того, как произошло присвоение. Результат выражения присваивания сам по себе не является переменной.

Поэтому, поскольку вы написали stop = true , вы удовлетворяете условию if .

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

if (stop = true) – это присвоение, а не сравнение.

Попробуйте, if (stop == true)

Также взгляните на десятку ошибок программистов Java .

Фактически, весь подход был бы более чистым, если бы вам пришлось использовать только один экземпляр StringBuffer, вместо того чтобы создавать его во всех рекурсивных вызовах … Я бы пошел:

 private String getWhoozitYs(){ StringBuffer sb = new StringBuffer(); while (generator.nextBoolean()) { sb.append("y"); } return sb.toString(); } 

Поскольку stop является логическим, вы можете изменить эту часть на:

 //... if(stop) // Or to: if (stop == true) { sb.append("y"); getWhoozitYs(); } return sb.toString(); //... 

Попробуй это:-

 private String getWhoozitYs(){ StringBuffer sb = new StringBuffer(); boolean stop = generator.nextBoolean(); if(stop) { sb.append("y"); getWhoozitYs(); } return sb.toString(); } 

= для присвоения

записывать

 if(stop){ //your code } 

или

 if(stop == true){ //your code } 

кроме того, вы можете просто написать

 if(stop) { sb.append("y"); getWhoozitYs(); } 
 if(stop == true) 

или

 if(stop) 

= для назначения.

== для проверки состояния.

 if(stop = true) 

Он присваивает true значение stop и оценивает if (true). Поэтому он всегда будет выполнять код внутри, если потому, что stop всегда будет присвоен true.

  • Значение генерирующего поля отражения
  • ConcurrentModificationException для ArrayList
  • Как я могу попросить Selenium-WebDriver ждать несколько секунд в Java?
  • Правильный способ проверки версии Java из сценария BASH
  • Ошибка «Не удалось найти главный class» при запуске jar, экспортированного Eclipse
  • Проверьте, заблокирован ли файл в Java
  • Зачем использовать интерфейсы, множественное наследование и интерфейсы, преимущества интерфейсов?
  • Какая часть бросания Исключения стоит дорого?
  • Избавьтесь от сообщения «Значение атрибута annotation должно быть константным выражением»
  • Как отключить JTextField
  • Какая лучшая библиотека обработки изображений java?
  • Interesting Posts

    Как эмулировать задания cron на Windows Server?

    Каков рекомендуемый нами способ частичного обновления веб-API?

    объекты data.table, назначенные с помощью: = из функции, не напечатанной

    Отказано в доступе HttpListener

    Нужен ли мне тип контента для HTTP-запросов?

    Как получить маленькие конечные данные из большого эндиана в c # с помощью метода bitConverter.ToInt32?

    «Последние документы» больше не предоставляются в меню «Пуск» в Windows 10?

    Ubuntu 10.10: второй экземпляр Firefox не подчиняется настройкам GTK2

    Могу ли я создать домен DNS для локального использования?

    Неоднократно разбивать несколько массивов

    Cloned XP не будет загружаться должным образом – застрял перед выбором экрана входа / выбора пользователя

    Попытка создания URL-адресов REST-ful с несколькими точками в части «filename» – Spring 3.0 MVC

    Разделить MPEG-видео из командной строки?

    Получить параметры url из строки в .NET.

    Node.js – получить необработанное тело запроса с помощью Express

    Давайте будем гением компьютера.