2017-03-04 5 views
1
public static String hero() { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Which hero will you play as: Wizard, Elf or Dwarf?"); 
     heroType = scanner.nextLine(); 
     if (heroType.equalsIgnoreCase("wizard") || heroType.equalsIgnoreCase("elf") || heroType.equalsIgnoreCase("dwarf")){ 
      //code 
      return heroType; 
     } 
     else { 
      System.out.println("This character is not recognised, please choose from Wizard, Elf or Dwarf."); 
      hero(); 
     } 
    } 

3つのオプションの1つが選択されている場合にのみ、このメソッドでheroTypeを返すようにします。そうでない場合は、メソッドを再度呼び出す必要があります。しかし、if文の外側にはreturn文がないので、コンパイラエラーが発生します。最後にreturn文を書くことの問題は、mainメソッドが "String h = hero();" "h"は他のメソッドに渡されますが、ユーザーが最初にウィザードのエルフまたはドワーフ以外のものを選択し、それを修正すると、最初にスキャナからの元の誤った値が格納されます。特定のことが起こった場合にのみ値を返すことはできますか?

最終的に正しい値を返す必要があり(最終的にはメソッドが呼び出されるたびに)、最終的には戻り値が返されるため、ユーザーが最終的に値を返さなくてはなりません。

答えて

3

使用:

return hero(); 

だけではなく呼び出しヒーロー();

+0

ありがとうございます。しかし、「ヒーローを返す」とは何ですか?実際には? –

+0

@JohnSmithあなたはウェルメイです。すべての "ヒーロー"メソッドの再帰呼び出しの最終的な戻り値を返します。 –

+0

そして 'else'を削除してください。 'if'に 'return'があるとき、すべてが' else'です – Bohemian

0

私は再帰的方法が嫌いです。 シンプルでスケーラビリティを保ちます。

public class Test 
{ 
    private static final Set<String> HEROES = new HashSet<>(4); 

    static { 
     HEROES.add("wizard"); 
     HEROES.add("elf"); 
     HEROES.add("dwarf"); 
    } 

    public static final void main(final String... args) { 
     hero(); 
    } 

    public static final String hero() { 
     final Scanner scanner = new Scanner(System.in); 
     String heroType; 

     while (true) { 
     System.out.println("Which hero will you play as: Wizard, Elf or Dwarf?"); 
     heroType = scanner.nextLine().trim().toLowerCase(); 

     if (HEROES.contains(heroType)) { 
      return heroType; 
     } 

     System.out.println("This character is not recognised, please choose from Wizard, Elf or Dwarf."); 
     } 
    } 
} 
関連する問題