Если вам нужен подробный ответ для этой простой вещи, прочитайте это
В отличие от переменных-членов, локальные переменные не получают значения по умолчанию во время загрузки класса.
Загрузка класса - это вещь времени выполнения в java означает, что когда вы создаете объект, класс загружается с загрузкой класса, только переменные-члены инициализируются со значением по умолчанию JVM не требует времени, чтобы присвоить значение по умолчанию вашему локальные переменные, потому что некоторые методы никогда не будут вызваны, потому что вызов метода может быть условным, поэтому зачем тратить время на то, чтобы присвоить им значение по умолчанию и снизить производительность, если эти значения по умолчанию никогда не будут использоваться.
В вашем случае restart является локальной переменной метода main, поэтому он не получает значения по умолчанию, и если вы пришли из C, фона C ++, вы склонны думать, что он может содержать значение мусора, но в java такого нет.
когда guess == num
равно false, тогда как при restart.equals("Y")
перезапуск ничего не содержит
Итак, перед использованием у вашей переменной должно быть какое-то значение.