In your method you must return
a variable in each case (for each if
statement), in this case, a boolean.
Example:
boolean checkHit2() {
if (cx < 0 || cx >= 640) {return true;}
if (cy < ground[(int)cx]) {return false;}
if (cx < blue + 15 && cx > blue - 15){
score = (int)score + 1;
return false;
}
Also, just to clean up your code a bit, the curly brackets are unneeded if the contents of the block is only one line. For example you can use:
boolean checkHit2() {
if (cx < 0 || cx >= 640) return true;
if (cy < ground[(int)cx]) return false;
if (cx < blue + 15 && cx > blue - 15){
score = (int)score + 1;
return false;
}
Functionally, they act the same. It’s just a useful shortcut to clean up your code :).
In this example i simply returned false because i’m insure of the functionality of your program or how you would like it to work. You could return a value based on a if
or else
statement, etc. but it’s up to you and what you want your program to do.
To see more about return
, click here
Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование «окончательной» модификатор, когда это применимо в Java
Сводка:
- Используйте модификатор
final
для обеспечения хорошей инициализации. - Избегайте возврата null в методы, например, при возврате пустых коллекций.
- Использовать аннотации
@NotNull
и@Nullable
- Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
- Сначала используйте значения с известным объектом:
if("knownObject".equals(unknownObject)
- Предпочитают
valueOf()
поверх toString (). - Используйте null safe
StringUtils
StringUtils.isEmpty(null)
.
задан user2864740 26 July 2014 в 04:05
поделиться
10 ответов
Если вы поместите оператор return в оператор if
, while
или for
, то он может или не может возвращать значение. Если он не войдет внутрь этого утверждения, тогда также этот метод должен вернуть некоторое значение (которое может быть нулевым). Чтобы убедиться, что компилятор заставит вас написать этот оператор return, который после if
, while
или for
.
Но если вы пишете блок if
/ else
и каждый из них возвращается в нем, тогда компилятор знает, что либо if
, либо else
получат выполнение, и метод вернет значение. Поэтому этот компилятор времени не заставит вас.
if(condition)
{
return;
}
else
{
return;
}
ответ дан Community 19 August 2018 в 03:50
поделиться
Попробуйте, как если бы if condition
возвращает false, поэтому он будет возвращать пустой, иначе ничего не вернуться.
public String myMethod()
{
if(condition)
{
return x;
}
return ""
}
Поскольку компилятор не знает, будет ли какой-либо из этих блоков if , поэтому он дает вам ошибку.
ответ дан bNd 19 August 2018 в 03:50
поделиться
Это потому, что если вы не пойдете в if, нет ничего, чтобы вернуться, поэтому он пропустит возвращение.
должно быть:
public String myMethod()
{
if(condition)
{
return x;
}
return y;
}
ответ дан Clad Clad 19 August 2018 в 03:50
поделиться
Это незаконный синтаксис. Для вас необязательно возвращать переменную. Вы ДОЛЖНЫ возвращать переменную типа, указанного в вашем методе.
public String myMethod()
{
if(condition)
{
return x;
}
}
Вы эффективно говорите: Я обещаю , любой класс может использовать этот метод (общедоступный), и я обещаю он всегда будет возвращать String (String).
Тогда вы говорите, что мое условие истинно, я верну x. Ну, это слишком плохо, в вашем обещании нет IF. Вы обещали, что myMethod ВСЕГДА вернет String. Даже если ваше условие ВСЕГДА истинно, компилятор должен предположить, что существует вероятность того, что он является ложным. Поэтому вам всегда нужно поместить возврат в конце вашего не-void-метода вне любых условий. JUST IN CASE все ваши условия терпят неудачу.
public String myMethod()
{
if(condition)
{
return x;
}
return ""; //or whatever the default behavior will be if all of your conditions fail to return.
}
ответ дан CodeCamper 19 August 2018 в 03:50
поделиться
Вы должны добавить оператор return, если condition
является ложным.
public String myMethod() {
if(condition) {
return x;
}
// if condition is false you HAVE TO return a string
// you could return a string, a empty string or null
return otherCondition;
}
FYI:
Oracle docs for return statement
ответ дан d3vnico 19 August 2018 в 03:50
поделиться
Это вернет строку , только если условие истинно.
public String myMethod()
{
if(condition)
{
return x;
}
else
return "";
}
ответ дан Deepak Tiwari 19 August 2018 в 03:50
поделиться
Это потому, что функция должна вернуть значение. Представьте, что произойдет, если вы выполните myMethod()
, и он не войдет в if(condition)
, что бы ваша функция вернулась? Компилятор должен знать, что нужно возвращать при каждом возможном выполнении вашей функции
Проверка документации по Java:
Определение: если декларация метода имеет тип возврата, тогда должно быть оператор возврата в конце метода. Если в операторе return нет ошибки, возвращаемой командой return.
Эта ошибка также возникает, если метод не имеет типа возврата и не был объявлен с использованием void (т. Е. Он был ошибочно опущен ).
Вы можете решить вашу проблему:
public String myMethod() { String result = null; if(condition) { result = x; } return result; }
ответ дан Guillermo Merino 19 August 2018 в 03:50
поделиться
Любой метод myMethod () должен возвращать значение String. Что, если ваше условие ложно, myMethod возвращает что-нибудь? ans нет, поэтому вам нужно определить return null или некоторое строковое значение в ложном состоянии
public String myMethod() {
boolean c=true;
if (conditions) {
return "d";
}
return null;//or some other string value
}
ответ дан loknath 19 August 2018 в 03:50
поделиться
попробуйте следующее:
public String myMethod()
{
if(condition)
{
return x;
}
return ""; //returns empty string
}
ответ дан Plengo 19 August 2018 в 03:50
поделиться
public String myMethod() // it ALWAYS expects a String to be returned
{
if(condition) // will not execute always. Will execute only when condition is true
{
return x; // will not be returned always.
}
//return empty string here
}
ответ дан TheLostMind 19 August 2018 в 03:50
поделиться
Другие вопросы по тегам:
Похожие вопросы:
I am starting with java and while I was writing a way to identify whether a number was prime I wrote a method like this
public static boolean checkPrime(int n){
int x = 2;
while (((n % x) != 0) && (n > x)){
x = x + 1;
}
if(((n % x) == 0) && (n == x)){
return !Prime;
}
else if(((n % x) == 0) && (n > x)){
return Prime;
}
else {
return Prime;
}
}
What I couldn’t figure out was the necessity of the last else statement. If I do not put it, I get an error message. However I don’t think it is necessary since all possibilities are covered by the previous loops, with their respecting return statements. Or am I missing something?
asked Jun 8, 2013 at 2:28
FSBFSB
491 silver badge10 bronze badges
7
You don’t need the else. What you are being told by the compiler is the method must return SOMETHING. Your last else
block could replaced by this:
return PrimeOrNot;
In fact, your method could look like this:
public static boolean checkPrime(int n){
int x = 2;
while (((n % x) != 0) && (n > x)){
x = x + 1;
}
if(((n % x) == 0) && (n == x)){
return !(PrimeOrNot);
}
return (PrimeOrNot);
}
In any case your very last statement block cannot be an else if
.
answered Jun 8, 2013 at 2:31
xagygxagyg
9,5222 gold badges31 silver badges29 bronze badges
The method has a return type of boolean.
The compiler is scared by the possibility in which none of the ‘if’ cases are met. In this situation, the method know what to return. This method needs to return something, so just give it a ‘return true’ before the method ends. It won’t ever be read, but it will make the compiler happy.
answered Jun 8, 2013 at 2:34
IanIan
5614 gold badges8 silver badges15 bronze badges
The conditional expressions within the if/else-if are only evaluated at runtime. Normally, the compiler wouldn’t know what the result would be, because they are not evaluated at compile-time. Only, situation when the compiler can figure what the result of the expression would be is when it’s some compile-time constant (like if(true) {
).
answered Jun 8, 2013 at 2:38
Bhesh GurungBhesh Gurung
50.4k22 gold badges93 silver badges141 bronze badges
public static boolean checkPrime(int n){
boolean PrimeOrNot = false;
int x = 2;
while (((n % x) != 0) && (n > x)){
x = x + 1;
}
if(((n % x) == 0) && (n == x)){
return !(PrimeOrNot);
}
else if(((n % x) == 0) && (n > x)){
return (PrimeOrNot);
}
return PrimeOrNot;
}
answered Jun 8, 2013 at 2:34
mconlinmconlin
8,0895 gold badges31 silver badges37 bronze badges
A method which returns a value will be compilable if it returns a value in all its possible code paths.
Imagine for a moment that you’re the compiler. You see this code:
int myMethod()
{
if (cond)
return anInt;
}
While you may know that cond
is in fact always true, the compiler will not know that. It can only be sure about the result of a boolean expression if it is an expression which can be evaluated at compile time only.
Note that the vast majority of «code optimization» in Java is in fact done at run time (JIT: Just In Time).
answered Jun 8, 2013 at 2:47
fgefge
119k33 gold badges254 silver badges329 bronze badges
The compiler only checks to see if there are valid return paths from your method. The compiler isn’t «smart» enough to inspect the conditional statements and determine whether the conditions can be logically met — the compiler simply checks to make sure that some value is returned to respect the contract of the method declaration.
Some would argue that the following is a cleaner structure for the method (but I think it is just a matter of taste):
public static boolean checkPrime(int n){
int x = 2;
while (((n % x) != 0) && (n > x)){
x = x + 1;
}
if(((n % x) == 0) && (n == x)){
return !(PrimeOrNot);
}
return (PrimeOrNot);
}
answered Jun 8, 2013 at 2:35
eebbeseneebbesen
5,0428 gold badges48 silver badges70 bronze badges
4 ответа
Прямо сейчас функция не гарантирует возврат boolean
, потому что возможно, что ни один из операторов if
никогда не будет введен.
Вы могли бы исправить это так (но только делать это, если это действительно то, что нужно вашей логике!):
public boolean Winner() {
for (int z = 0; z < 3; z++) {
if (board[z] != null && board[z] == board[z+3] && board[z] == board[z+6]
) {
return true;
}
}
for(int i=0; i<7;i+=3){
if (board[i] != null && board[i] == board[i+1] && board[i] == board[i+2]) {
return true;}
}
return false;
}
musical_coder
02 дек. 2013, в 18:05
Поделиться
Компилятор Java не делает предположений, что цикл for
будет иметь итерацию или что будет выполняться блок операторов if
.
Существуют пути выполнения, в которых нет инструкции return
. Что произойдет, если путь выполнения не выполнит какие-либо из существующих операторов return
и опустится до конца? Там нет return
.
Добавьте return
внизу.
rgettman
02 дек. 2013, в 18:30
Поделиться
Все возможные способы выхода метода должны возвращать что-то. Если ваш код делает это через оба цикла, не имея условия if, чтобы определить значение true, вам нужно вернуться в конце, который указывает, что возвращается.
Nathan Hughes
02 дек. 2013, в 18:34
Поделиться
Компилятор не знает, что будет выполнен хотя бы один из циклов. Он учитывает все возможности выполнения, и один из них состоит в том, что ни одна из циклов не будет выполнена, и в этом случае нет оператора возврата. Поэтому добавьте оператор возврата из циклов.
Nick Div
02 дек. 2013, в 19:00
Поделиться
Ещё вопросы
- 1Как узнать, когда выложена активность?
- 1Приложение магазина C #, получающее переменные данные Json
- 0Как вычесть месяцы из даты и справиться с переполнением?
- 0Скомпилируйте Qt-проект и включите библиотеки Qt
- 1Как навсегда отключить автомобильный режим?
- 1Обещание Resolve возвращает 2 массива один неопределенный
- 3Рассчитать остаточное отклонение от модели логистической регрессии scikit-learn
- 1javascript document.getElementsbyClassName не является функцией
- 0Необработанное исключение, не похоже, что что-то не так
- 0Ошибка определения функции C ++ (передача параметров)
- 0Ошибка токена для ApsaraDB для RDS (MySQL) при изменении настроек белого списка в облаке Alibaba
- 0Как я могу сделать «слайдер» справа налево (или как угодно), нажав на стрелку Nav
- 1Веб-сайт Azure Подключение к базе данных Azure отлично работает на локальных, но не развернутых
- 1Почему я не могу определить элемент DOM как глобальную переменную?
- 0Перечисление данных медленно в codeigniter
- 0Apache Shiro и Spring MVC
- 1Остановить запись звука — Java
- 1Office 365 надстройка Javascript — синтез речи
- 0отправка почты с использованием бесплатной функции codignator, доставляемой как спам
- 0Вызов одного метода из другого
- 1Не удается запустить приложение Windows Phone с пользовательской схемой URL
- 0PHP-код для прикрепления формы внутри выражения echo
- 1Определите метод с универсальным параметром типа M <T> в C #
- 0привязка события click к jqzoom для запуска fancybox
- 0Rails Forms: изменить поля формы из ранее выбранных полей
- 0Как нажать на элемент, используя другой связанный элемент?
- 1Использование Unicode в пункте меню google-apps
- 1Удаление одинаковых выбросов в двух временных сериях
- 0Актуальный URL открыть страницу перенаправления в php
- 1Запускать программу, только если ввод состоит из одной буквы
- 0Rails — Получить URL-адрес Paperclip с помощью SQL-запроса
- 0Использовать селекторы jQuery рекурсивно?
- 0получить записи с той же строкой JSON
- 0MySQL Insert Slow в AWS RDS
- 1Как определить, что для fillStyle был назначен недопустимый цвет?
- 1Какой сценарий «закрывает» DIV, если пользователь щелкает за его пределами? (версия 5 или>, а не jQuery)
- 1QueryDocumentSnapshot не может разрешить
- 1Разбор строки данных: split против регулярного выражения
- 0в GWT или GWTP, как экспортировать html-страницу, чтобы группа графического дизайна могла выполнять свою работу, не раскрывая им исходный код?
- 1Как машинописный текст разрешает импорт @ angular / core / testing и как упаковывается угловое ядро?
- 0Android Room — Обработка списка объектов в объекте и запрос результатов
- 0Встроенный диалог в Tab Control не может работать во втором диалоге, MFC
- 0Я хочу отключить кнопку Время входа в систему.
- 0Как связать файл статической библиотеки на машине Linux
- 0Значение столбца не отображается в сетке ng (ui)
- 1Инъекция коинов от конструктора в Котлине
- 1Привязать динамически сгенерированный Grid как DataTemplate к HubSection в C #
- 1LinqToSql — SQL, сгенерированный CONCAT (UNION)
- 1Экспорт таблицы Excel с сервера в JavaScript