【问题标题】:Returning a result of type String (Java)返回字符串类型的结果(Java)
【发布时间】:2015-01-05 09:23:35
【问题描述】:

在 Java 中返回 String 类型的结果时遇到问题。 这是整个代码

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(boolean correct) 下显示一条红线。

有人在我搞砸的地方吗? 提前致谢!

【问题讨论】:

  • 谢谢大家。我已经按照你的建议解决了我的问题。抱歉延迟回复。

标签: java string return


【解决方案1】:

编译器不能断言你的方法返回一个字符串。

这是因为您的 switch-case 可能无法返回任何内容。

你可以通过放置一个来满足编译器

return null;

在你的方法结束时。

【讨论】:

  • 如果您对为什么编译器本质上无法检测代码是否以一种或另一种方式运行感兴趣,请查看en.wikipedia.org/wiki/Halting_problem,但这远远超出了你在问。
【解决方案2】:

createResponse 方法可能并不总是在您的代码中到达 return 语句。如果第二个 switch 语句中的任何情况都不适用,它将到达代码块的底部而不返回。

只要确保在方法结束时返回一些东西(或找到另一个不错的解决方案):

return "";
}//end method createResponse

【讨论】:

    【解决方案3】:

    这是因为如果两个 switch 语句中的任何一个条件都不满足,则不会返回任何内容。尝试类似:

    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;
    }
    

    【讨论】:

      【解决方案4】:

      您在 createResponse 方法中缺少“if”的“else”部分和“switch-case”的“default”部分。

      编辑: 好的,“其他”不是必需的,但我一开始就错过了。第二个“开关”的缩进令人困惑。请使用括号来避免这种情况。

      此外,编译器认为它可能不会执行任何“case”分支,因为它不知道 nextInt 返回的整数范围为 0..3。您需要添加 default 大小写以满足编译器的要求。

      【讨论】:

        【解决方案5】:

        编译器还不够聪明,还不知道nextInt(4) 可能只返回0123,因此它假定对于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
        

        顺便说一句,您可以通过使用存储您的响应的数组来稍微简化您的代码。这样你的代码可能看起来像

        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)];
        }
        

        【讨论】:

        • 我还在学习使用数组。所以希望以后学完Array章节后用你的方法:)
        猜你喜欢
        • 1970-01-01
        • 2014-09-27
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多