2013-11-22 4 views
2

Может ли кто-нибудь понять, почему я получаю сообщение об ошибке «Этот метод должен возвращать результат типа Card», когда я четко возвращаю эту переменную «card», которая имеет тип Card?Почему я получаю сообщение об ошибке «Этот метод должен возвращать результат типа ...»?

public Card playCard(int id){ 
    int i = 0; 
    for (Card element : hand){ 
     if (i <= hand.size()) 
     {   
      if (element.getID() == id) 
      { 
       Card card = hand.get(i); 
       hand.remove(i); 
       return card; 
      } 
      else 
      { 
       i++; 
      } 

     } 
     else 
     { 
      throw new NullPointerException("Card does not exist in  hand"); 
     } 
    } 
} 
+5

Подсказка: вам нужно «вернуть» из всего возможного потока выполнения. –

+2

Никогда не бросайте 'NullPointerException' самостоятельно. – arshajii

+0

@arshajii Throwing «NullPointerException» явно после проверки, вместо того, чтобы, возможно, выполнить некоторую дорогостоящую обработку, а затем получить доступ к «null», безусловно, отлично. Явное или неявное исключение должно быть одинаковым (вместо 'InvalidArgumentException' или что-то еще), вызывающему абоненту не нужно заботиться о деталях реализации. Конечно, это не имеет никакого отношения к этому вопросу, просто комментируя ваш «никогда». – hyde

ответ

5

Ваш метод не возвращает ничего, кроме одного возможного сценария. Он должен что-то вернуть (или выбросить исключение) в все возможных сценариев.

Я думаю вы имели в виду, чтобы сделать это:

public Card playCard(int id){ 

    for (Card element : hand) { 
     if (element.getID() == id) { 
      return element; 
     } 
    } 
    throw new SomeAppropriateException("Card does not exist in  hand"); 
} 

... но я предполагаю, что немного (я не знаю, что hand есть, но он много выглядел как List). Этот код всегда либо выполняет оператор return, либо генерирует исключение, и нет способа добраться до конца метода без какой-либо из этих вещей.

Обратите внимание, что бросание NullPointerException для условия, не вызванное null указателя является плохой идеей (тм). (. Это также лучше, чтобы быть последовательной в котором вы кладете { и })

+2

Следует отметить, что он может выдать ошибку (например, его/ее NPE) вместо возврата значения. –

+0

@ ns47731: Хорошая точка. –

1

Как намекают Tarlen, ваш код должен был бы быть изменен так:

public Card playCard(int id){ 
    int i = 0; 
    for (Card element : hand){ 
     if (i <= hand.size()) 
     {   
      if (element.getID() == id) 
      { 
       Card card = hand.get(i); 
       hand.remove(i); 
       return card; 
      } 
      else 
      { 
       i++; 
      } 

     } 
     else 
     { 
      throw new NullPointerException("Card does not exist in  hand"); 
     } 
    } 
    return null; 
} 

Я считаю, что будет учитывайте все возможные маршруты, которые ваша программа должна будет выполнять. Вы всегда должны следить за возвратом чего-то, КОГДА-ЛИБО метод может выйти. Если он может выйти, не нажав оператор return, вы увидите эту ошибку.

1

Ваш метод подписи:

public Card playCard(int id){ 

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

0

Это потому, что если hand пуст, то значение не возвращается.

Добавить return или throw после вашего цикла for.

0

Для всего возможного пути выполнения в коде необходимо иметь оператор return по умолчанию (или исключение/ошибку) для всего метода или хотя бы один оператор return (или исключение/ошибка). Как сейчас, у вас нет ни одного из них.

Смежные вопросы