2014-11-08 3 views
0

У меня проблема с возвратом результата типа String в Java. Вот весь кодВозврат результата типа String (Java)

import java.util.*; 

public class Multiplication 
{ 
    static Random randomNumbers = new Random(); 
    static Scanner input = new Scanner(System.in); 
    static int answer; 

public static void multiplication() 
{ 
    createQuestion(); //display first question 
    int guess; //student's answer 
    System.out.print("Your answer is (-1 to quite): "); 
    guess = input.nextInt(); 

    while(guess != -1) 
    { 
     checkAnswer(guess); 

     System.out.print("Your answer is (-1 to quite): "); 
     guess = input.nextInt(); 
    } 
} //end method multiplication 

//create new question 
public static void createQuestion() 
{ 
    int num_1 = randomNumbers.nextInt(10); 
    int num_2 = randomNumbers.nextInt(10); 
    answer = num_1 * num_2; 
    System.out.printf("How much is %d times %d?\n", num_1, num_2); 
}//end method createQuestion 

public static String createResponse(boolean correct) 
{ 
    if (correct) 

     switch(randomNumbers.nextInt(4)) 
     { 
     case 0: 
      return ("Very good!"); 
     case 1: 
      return("Excellent!"); 
     case 2: 
      return("Nice work!"); 
     case 3: 
      return ("Keep the good work"); 
     } //end switch 

//otherwise, assume incorrect 
     switch(randomNumbers.nextInt(4)) 
     { 
     case 0: 
      return("No. Please try again."); 
     case 1: 
      return("Wrong. Try once more."); 
     case 2: 
      return("Don't give up!"); 
     case 3: 
      return("No. Keep trying."); 
     }//end switch 

}//end method createResponse 

//check in the student answer correctly 
public static void checkAnswer(int guess) 
{ 
    if(guess != answer) 
    { 
     System.out.println(createResponse(false)); 
    } 
    else 
    { 
     System.out.print(createResponse(true)); 
     createQuestion(); 
    } 

}//end method checkAnswer 
}//end class Multiplication 

А вот главный метод

public class MultiplicationTest { 

    public static void main(String[] args) { 

     Multiplication app = new Multiplication(); 
     app.multiplication(); 
    } 

}

Проблема заключается в createResponse(boolean correct) method. Here JDE is saying that "This method must return a result of type String". Я упомянул о возврате типа String. Но программа не выполняется. Отображение красной строки под методом createResponse (логическое значение корректно).

Кто-нибудь, где я перепутался? Спасибо заранее!

+0

Спасибо всем. Я решил свою проблему по вашему предложению. Извините за отложенный ответ. – Mamun

ответ

2

Компилятор не может утверждать, что ваш метод возвращает строку.

Это связано с тем, что ваш коммутационный корпус может ничего не вернуть.

Вы можете удовлетворить компилятор, поместив

return null; 

в конце вашего метода.

+0

Если вам интересно, почему компилятор * существенно * не может определить, работает ли код так или иначе, посмотрите на http://en.wikipedia.org/wiki/Halting_problem, но это далеко за пределами того, что вы спрашивая. –

1

Вам не хватает части «else» для случая «if» и «default» для «switch-case» в методе createResponse.

Редактировать: ok, 'else' не требуется, но я пропустил это в первую очередь. отступы второго «переключателя» сбивают с толку. используйте круглые скобки, чтобы избежать этого.

Кроме того, компилятор полагает, что может случиться так, что ни одна из ветвей «случая» не будет выполнена, так как она не знает о возвращаемых целых числах nextInt в диапазоне 0..3. вам нужно добавить футляр default, чтобы удовлетворить компилятор.

1

Метод createResponse может не всегда достигать оператора возврата в коде. Если ни один из случаев в вашем втором операторе переключения не применим, он дойдет до нижней части кода без возврата.

Просто убедитесь, что вы что-то вернуть в конце метода (или найти другое хорошее решение):

return ""; 
}//end method createResponse 
1

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

public static String createResponse(boolean correct) 
{ 
    String result = null; 
    if (correct) 

     switch(randomNumbers.nextInt(4)) 
     { 
     case 0: 
      result = "Very good!"; 
// Insert the rest of the code here, assigning to result rather than returning as above. 
    return result; 
} 
1

Компилятор не достаточно умна еще знать, что nextInt(4) может возвращать только 0, 1, 2 и 3 поэтому предполагается, что для случая как 5 вы текущий код не будет ничего возвращать, но если метод заявляет, что он вернет некоторую ценность, должен гарантировать, что некоторое значение всегда будет возвращено.

Для решения этой проблемы вы можете изменить: case 3: - default:.Это заставит компилятор предположить, что даже для случаев, которые не являются 0, 1, 2 некоторое значение будет возвращено.

Кроме того, кажется, что ваш код будет чище, если вы будете использовать else и дополнительные фигурные скобки, как

public static String createResponse(boolean correct) { 
    if (correct){ 
     switch (randomNumbers.nextInt(4)) { 
     case 0: 
      return ("Very good!"); 
     case 1: 
      return ("Excellent!"); 
     case 2: 
      return ("Nice work!"); 
     default: 
      return ("Keep the good work"); 
     } 
    } else { 
     switch (randomNumbers.nextInt(4)) { 
     case 0: 
      return ("No. Please try again."); 
     case 1: 
      return ("Wrong. Try once more."); 
     case 2: 
      return ("Don't give up!"); 
     default: 
      return ("No. Keep trying."); 
     } 
    }// end switch 

}// end method createResponse 

BTW вы можете упростить ваш код немного, используя массивы, которые будут хранить ваши ответы. Таким образом, ваш код может выглядеть

private static String[] good = { "Very good!", 
           "Excellent!", 
           "Nice work!", 
           "Keep the good work" }; 
private static String[] bad = { "No. Please try again.", 
           "Wrong. Try once more.", 
           "Don't give up!", 
           "No. Keep trying." }; 

public static String createResponse(boolean correct) { 
    if (correct) 
     return good[randomNumbers.nextInt(4)]; 
    else 
     return bad[randomNumbers.nextInt(4)]; 
} 

или даже

public static String createResponse(boolean correct) { 
    return correct ? good[randomNumbers.nextInt(4)] 
        : bad[randomNumbers.nextInt(4)]; 
} 
+0

Я все еще участвую в использовании массивов. Поэтому я надеюсь, что буду использовать ваш метод позже после изучения главы Array :) – Mamun

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