【问题标题】:Java method returning char complaining about not returning char.返回 char 的 Java 方法抱怨不返回 char。
【发布时间】:2015-02-05 04:10:23
【问题描述】:

为什么这个函数抱怨它应该返回 char 类型的结果?

public static char getUserResponseToGuess(int guess){
    Scanner input = new Scanner(System.in);     
    char userResponse = 'x';            
    while((userResponse != 'h' && userResponse != 'l' && userResponse != 'c')){
        System.out.print("Is it" + guess + "? (h/l/c)");        
        userResponse = input.next().charAt(0);
        if (userResponse == 'h' || userResponse == 'l' || userResponse =='c'){
            return userResponse;            
        }
        else{
            System.out.print("Is it" + guess + "? (h/l/c)");
        }
    }
}

【问题讨论】:

    标签: java methods char


    【解决方案1】:

    编译器所做的静态分析不理解您使用的逻辑,因此根据其分析,所有可能的流程最终都不会返回值

    编译器在分析代码时,如果代码中的if条件不满足而退出循环,则方法不会返回值。

    public static char getUserResponseToGuess(int guess){
        Scanner input = new Scanner(System.in);     
        char userResponse = 'x';            
        while((userResponse != 'h' && userResponse != 'l' && userResponse != 'c')){
            System.out.print("Is it" + guess + "? (h/l/c)");        
            userResponse = input.next().charAt(0);
            if (userResponse == 'h' || userResponse == 'l' || userResponse =='c'){
                return userResponse;            
            }
            else{
                System.out.print("Is it" + guess + "? (h/l/c)");
            }
        }
        return userResponse;  
    }
    

    【讨论】:

    • 如果你对编译器有所帮助(例如通过while (true)),它也不会抱怨。
    • @vanza ...您能稍微扩展一下这个概念吗?
    • while (true) 循环永远不会结束,除非您明确地使用 returnbreak 来完成它。编译器看到退出循环的唯一方法是return,因此它不会抱怨缺少返回值。
    • 哇哦。我对Java很陌生。我不知道 return 语句也会让我脱离循环。很高兴知道。 ;)
    • 现在我正在考虑这件事,这就是 Arun 正在做的事情。
    【解决方案2】:

    userResponse 不是这三个字符之一时会发生什么?它将退出循环并返回什么?每条路径都必须返回一个char

    【讨论】:

    • 当它不是这些字符之一时,代码将在循环内执行return 语句。
    • 糟糕,恰恰相反。如果它不是其中之一,它将一直留在循环中,直到它是,然后它执行return 语句。
    • 编译器不够聪明,无法遍历所有逻辑并知道它必须返回。
    • 确实如此,但这不是您的回答所说的。您的回答假设他的代码是错误的,但事实并非如此;只是编译器不够聪明,无法理解。
    • 嗯,这就是问题所在:为什么它不编译。它不能编译不是因为它在逻辑上是错误的,而是因为编译器不够聪明。这两者是有区别的。
    【解决方案3】:

    这可以正常工作。 Arun P Johny 解决方案也有效。

    public static char getUserResponseToGuess(int guess){
        Scanner input = new Scanner(System.in);     
        char userResponse = 'x';            
        System.out.print("Is it " + guess + "? (h/l/c): ");
        while((userResponse != 'h' && userResponse != 'l' && userResponse != 'c')){             
            userResponse = input.next().charAt(0);
            if (userResponse == 'h' || userResponse == 'l' || userResponse =='c'){
                break;                          
            }
            else{
                System.out.print("Is it " + guess + "? (h/l/c): ");
            }
        }
        return userResponse;    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多