Java不会从扫描仪输入返回字符串

时间:2016-04-02 07:15:38

标签: java string java.util.scanner

我正在练习Java而且我遇到了一个奇怪的问题,或者我应该说问题。

当我编译下面的代码时,它说java line#:error:

  

缺少退货声明。

如果我删除了return "not valid"所在的评论,则会进行编译。

现在这是其他问题的来源。当我将init_configfinal_config字符串作为AB传递时,它返回无效。但是,当我将"A""B"传递给其他函数(other("A", "B")时,将返回/打印特定的"C"返回。

我不确定问题是否在于我的输入法。我为init_config和final_config输入的数据应该是字符串值,对吗?我不确定Scanner是否是一个很好的字符串输入法。但是,如果我打印两个输入它工作正常,所以我不确定它是否是数据丢失或字符串引用传递时丢失。

我也尝试用init_config = in.next()替换init_config = in.nextLine(),但它没有任何区别。

是否有必要在函数末尾使用return "not valid"编译代码,还是可以通过某种方法绕过它?如何使用Scanner输入法传递字符串数据而不会有任何损失?

这是我的代码:

import java.util.Scanner;
public class towerGen
{
    public static void main(String[]args)
    {
        Scanner in = new Scanner(System.in);
        String init_config, final_config;

        System.out.print("Enter initial configuration: ");
        init_config = in.next();

        System.out.print("Enter final configuration: ");
        final_config = in.next();

        System.out.print(other(init_config, final_config));

    }

    public static String other(String src, String dest)
    {
        if (src=="A" && dest=="B") 
            return "C";
        if (src=="B" && dest=="A")
            return "C";
        if (src=="B" && dest=="C")
            return "A";
        if (src=="C" && dest=="B")
            return "A";
        if (src=="A" && dest=="C")
            return "B";
        if (src=="C" && dest=="A")
            return "B";
    //return "not valid";
    }
}

3 个答案:

答案 0 :(得分:1)

  

是否有必要使用return"无效"编译代码?在功能的最后?

是的,确实如此。因为编译器会识别出如果输入字符串不符合您列出的任何条件,则无法返回任何内容,这是非void方法中的错误。

另外,在other方法中,比较字符串时应使用src.equals("A")而不是src == "A"

答案 1 :(得分:0)

我认为你几乎得到了上述讨论的答案,即

  

使用等于方法代替 == 。因为 == 检查对象引用是否引用同一个对象而不是其中的内容。

当你调用其他("A", "B")函数时,想要回答为什么它正在工作,因为它带来了字符串池的概念,值得注意。

  

但是当我通过" A"和" B"到其他功能(其他(" A"," B")返回/打印特定的返回" C"

当我们创建一个String对象没有 new运算符(又名String literal)时,它使用String池来获取该对象。如果不存在,它将创建并将其放入字符串池中。字符串池是共享的。如果我们使用new运算符,它将始终创建一个新的String对象,并且即使存在一个对象也不会引用它。

当您调用other("A", "B")时,此处的参数指向字符串池中的字符串对象。然后在other(..)方法执行src=="A"之类的检查时,它会返回true,因为src和" A"是指池中相同的字符串对象。

要对此进行测试,您可以尝试使用System.out.print(other(new String("A"), "B"));,这会再次返回无效

您可以参考java string with new operator and a literal了解更多信息。

答案 2 :(得分:0)

也许这会对某人有所帮助

import java.util.Scanner;
public class towerGen
{
Scanner in = new Scanner(System.in);

public static void main(String[]args)
{
    Scanner in = new Scanner(System.in);
    String init_config, final_config;

    System.out.print("Enter initial configuration: ");
    init_config = in.next();

    System.out.print("Enter final configuration: ");
    final_config = in.next();

    System.out.print(other(init_config, final_config));

}

public static String other(String src, String dest)
{   String C = "C";
    String B = "B";
    String A = "A";

    if ("A".equals(src) && "B".equals(dest)) 
        return C;
    if ("B".equals(src) && "A".equals(dest))
        return C;
    if ("B".equals(src) && "C".equals(dest))
        return A;
    if ("C".equals(src) && "B".equals(dest))
        return A;
    if ("A".equals(src) && "C".equals(dest))
        return B;
    if ("C".equals(src) && "A".equals(dest))
        return B;
//return "not valid";
    else return null;
}
}