Методы Java - что на самом деле означает RETURN? - PullRequest
1 голос
/ 15 ноября 2011

Я почти уверен, что упускаю что-то действительно очевидное здесь, но это кажется довольно странным.

Я разрабатываю для Android с использованием Eclipse - и у меня есть метод, аналогичный тому, который я отлаживаю ион делает что-то довольно странное ...

public boolean test() {
    if (variable == value) 
        return true;
    // more code appears here
    return false;
}

Пройдя через это, в первой строке (оператор if) отладчик предполагает, что переменная действительно равна значению (у них есть обе байтовые переменные со значением0) - отладчик затем перемещается на 2-ю строку (возвращаемое значение true), но затем он переходит на последнюю строку (возвращает ложное значение) - пропуская все промежуточное значение!?

Возвращенное значение было равно «false»

WTF там происходит?Я предполагал, что RETURN полностью выйдет из метода - но отладчик (и возвращаемое значение, возвращаемое - ложь) предполагает, что он ничего подобного не делает!?

Чего мне не хватает, смотрящегомне в лицо?Всегда ли выполняются операторы return как последняя строка методов или что-то в этом роде?

ps интересное обновление ...

Переменные, которые я использую, присваиваются в коде, который я не писал - япросто откопал источник и перестроил / перезапустил отладчик с доступом к этому источнику, и я нашел в нем эту строку

byte variable = (byte)9;

Можете ли вы увидеть что-то не так с этим, и это, возможно, объясняетКак вы думаете, проблема?Я написал автору по электронной почте, но пока ... эм ...

Обновление2

Хорошо, я полностью переделал проект, очистил и перестроил его, удалил и переустановил его в телефон иотладчик теперь ведет себя более разумно ...

Проблема, очевидно, заключается в использовании '9' (они используют 0-9 в качестве возможных значений в байте !!) - теперь произошло то, что хотя отладчикпредполагая, что 'variable' равно '0' - это также не соответствует сравнению с (байтом) 0, и, таким образом, я получаю 'false' return - что на самом деле правильно.

Я, очевидно, застрял, пока они не изменят свой код наиспользуйте короткий - что касается принятия ответа, это сложно, так как ответы «перестроить все» и ответы «сравнить с использованием (byte) или bytevalue ()» были как-то правы!?

Ответы [ 10 ]

7 голосов
/ 15 ноября 2011

Если это байтовые объекты, выделенные с помощью new, то == проверит, являются ли они одним и тем же объектом в памяти, и вернет falseПопробуйте использовать:

variable.byteValue() == value.byteValue()

вместо.

6 голосов
/ 15 ноября 2011

Я думаю, что ваша проблема в том, что, когда вы используете объект Byte, выполнение == не сравнивает VALUES байтов, а вместо этого сравнивает объект в памяти.Это похоже на то, как String работает .

Вместо этого попробуйте:

public boolean test() { 
    if (variable.equals(value))  
        return true; 
    // more code appears here 
    return false; 
} 

Обновление на основе комментария

Есливы сравниваете два байта (в частности, переменную и значение), убедитесь, что вы преобразуете в байт оба значения (см. Двоичное числовое продвижение , почему).Итак, попробуйте:

public boolean test() {     
    if ((byte)variable == (byte)value)      
        return true;     
    // more code appears here     
    return false;     
}   
2 голосов
/ 15 ноября 2011

Я не думаю, что ваш кодовый буфер в eclipse совпадает с тем, что отлаживается.Единственный раз, когда вы должны увидеть выполнение кода после оператора return, вы используете блок finally, в котором вы увидите выполнение кода в блоке finally после оператора return в отладчике.

1 голос
/ 15 ноября 2011

Ваше описание вашего кода не соответствует коду, который вы вставили.Я подозреваю, что это признак реальной проблемы: вы шагаете по исходному коду, который не совпадает с вашим скомпилированным кодом.Номера строк не совпадают.Так что, похоже, он делает разные дурацкие вещи.Перестройте свой скомпилированный код и снова отладьте.

1 голос
/ 15 ноября 2011

Являются ли операторы возврата последней строкой всегда выполняемых методов или что-то?

номер

Попробуйте окружить блок if в {} и посмотрите, что получится.

0 голосов
/ 15 ноября 2011

Это нормальное поведение при использовании отладчика Eclipse. Я рекомендую вам посмотреть значение, возвращаемое самим методом, а не выполняемый код (это будет true, а не false).

Например, попробуйте следующий код. Вы увидите, что возвращаемое значение true достигнуто, но позже foo и foo2 не инициализируются (хотя кажется, что оно возвращает return false).

public boolean test() {
    if (variable == value) 
        return true;

    int foo = 5;
    int foo2 = 7;
    // more code appears here
    return false; }
0 голосов
/ 15 ноября 2011

Я не вижу открытой скобки после вашего заявления "если". Это должно выглядеть так:

public boolean test() {
    if (variable == value) {     
        return true;
    // more code appears here
    }
    return false;
}

С дополнительными скобками «true» будет связано только с условиями IF, а false будет только в том случае, если условия IF не выполнены.

0 голосов
/ 15 ноября 2011

Вы можете попробовать удалить «здесь появляется больше кода» и добавлять этот код построчно, пока не найдете ошибку.Также попробуйте перезапустить Eclipse, очистить проект и заново развернуть приложение.

0 голосов
/ 15 ноября 2011

Это не должно быть, и то, что вы знаете о возвращении, уже правильно.

Это может произойти, если скомпилированный двоичный файл отличается от исходного кода.Попробуйте очистить свой проект и восстановить его.

0 голосов
/ 15 ноября 2011

Логически, оператор return немедленно завершает работу метода -

Но прежде, чем это произойдет, могут произойти другие вещи, например, оператор finally после включающего блока try.

Обычноотладчик будет переходить к закрывающей скобке метода после оператора return, а не к последнему оператору return.

Это заставляет меня думать, что в вашем методе есть что-то необычное или что метод, который вы видите вОтладчик не идентичен методу, который выполняется на устройстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...