2013-03-23 2 views
0

Возможно, моя проблема глупа, но я не могу ее решить.Не удается вернуть значение внутри метода java

Вот мой код:

public Velocity add(final Velocity velocity) 
{ 
    Velocity vel; 
    if(velocity.getClass().equals(CartesianCoordinate(x, y))) 
    { 
     double sumX = x + velocity.x; 
     double sumY = y + velocity.y; 
     Velocity v = new Velocity(CartesianCoordinate(x,y)); 
     v.x = sumX; 
     v.y = sumY; 
     vel = v; 
    } 

    if(velocity.getClass().equals(p)) 
    { 
     do something... 
    } 
    return vel; 
} 

Может ли один скажите мне, почему я не могу вернуться «о себе», я не хочу, чтобы создать переменную класса ...

ответ

2

Может ли одно сказать меня почему я не могу вернуть «vel»

Уверенный - вы не дали ему значения, если ни одно из ваших условий не является истинным. Переменная не определенно назначена, поэтому вы не можете ее прочитать, чтобы вернуть ее. Что вы делаете хотите, чтобы вернуться в этом случае? Действительно ли это действительно? Возможно, вы должны сделать исключение в этом случае.

Лично я бы действительно вернулся с каждого из блоков if - я не думаю, что локальная переменная добавляет какую-либо выгоду. В этот момент, было бы более очевидным, что было неправильно:

public Velocity add(final Velocity velocity) { 
    if (...) { 
     ... 
     return ...; 
    } 
    if (...) { 
     ... 
     return ...; 
    } 
    // What should we do if we get here? 
} 

Теперь, когда оба ваших условий, сделать определения возвращаемого значения просто вернуть его немедленно, это более очевидно (ИМО), что если вы получите внизу, потому что ни одно из условий не оценивалось как true ... поэтому либо вы хотите вернуть некоторое «пустое» значение, либо нулевую ссылку, либо выбросить исключение.

Конечно, предполагается, что вы не хотите, чтобы второе условие эффективно превзошло первое, что оно делает в данный момент - если оба условия истинны, значение, установленное в первом блоке, по-видимому, не имеет значения, поскольку оно будет перезаписан вторым блоком.

Непонятно, что такое CartesianCoordinate, но это странно названо для метода Java - и если он возвращает Class<?>, это определенно странно. Что такое p? Я не знаю, отличается ли ваш реальный код от этого, но даже если не считать, что это не скомпилируется, оно мне неприятно.

+0

Если я положил «return v» внутри оператора IF, я получаю ошибку, что мой метод не имеет возврата ... Вот почему была создана локальная переменная ... – Gudron

+0

@RuslanZarinaSeidovi: Ну, не то, что у него есть * no * return - вы получите сообщение об ошибке, указывающее, что оператор return * отсутствует *, потому что вы можете добраться до конца метода, не возвращая ничего. Что вы хотите, если вы доберетесь до этого? Вы * либо * должны что-то вернуть, * или * выбросить исключение. –

1

Локальные переменные не имеют значений по умолчанию и должны быть инициализированы.

Если val было полем экземпляра или статическим полем, и оно не инициализировано, оно возвращает значение по умолчанию при обращении к нему.

+0

Спасибо. Я просто делаю это равным нулю, а его работы ... – Gudron

+3

@RuslanZarinaSeidovi: Он * компилирует * - но это не то же самое, что и * work *. Не просто делать это слепо - подумайте о том, что это означает *, чтобы добраться до конца метода, не поразив ни одного условия, и что вы хотите в этом случае. –

0

Вы можете возвращать только переменные со значением. Таким образом, возможен случай, когда val его нет.

easies способ решить эту проблему, чтобы инициализировать val непосредственно на декларации:

Velocity vel = null; //or 
Velocity vel = new Velocity(); 

Или вам нужно добавить else ветви к вашему if заявлению, где vel инициализируются также.

if(velocity.getClass().equals(CartesianCoordinate(x, y))) 
{ 
    double sumX = x + velocity.x; 
    double sumY = y + velocity.y; 
    Velocity v = new Velocity(CartesianCoordinate(x,y)); 
    v.x = sumX; 
    v.y = sumY; 
    vel = v; 
}else{ 
    vel = null;//or 
    vel = new Velocity(); 
} 
Смежные вопросы