我正在练习Java,遇到了一些奇怪的问题,或者我应该说一些问题。
当我编译下面的代码时,代码上写着java行# :error:
丢失返回语句。
如果删除包含return "not valid"的注释,它就会编译。
这就是另一个问题出现的地方。当我将输入的init_config和final_config字符串作为A和B传递时,它返回无效的字符串。但是,当我将"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";
}
}发布于 2016-04-02 07:19:16
是否有必要编译函数末尾返回“无效”的代码?
是的,是这样的。因为编译器认识到,如果输入字符串不符合您列出的任何条件,就没有什么可返回的,这是非空方法中的一个错误。
此外,在您的other方法中,在比较String时应该使用src.equals("A")而不是src == "A"。
发布于 2016-04-02 07:46:47
我想你从上面的讨论中得到了很好的答案,
使用等于方法而不是==。因为==检查两个对象引用是否指向同一个对象,而不是其中的内容。
当您调用其他("A", "B")函数时,它为什么会工作,因为它在图片中引入了字符串池的概念,值得注意。
但当我将"A“和"B”传递给其他函数(“A”、"B")时,返回的是"C“。
当我们创建一个字符串对象而没有 new运算符(也称为String new运算符)时,它使用字符串池来获取该对象。如果不存在,它将创建并放入字符串池中。字符串池是共享的。如果我们使用new操作符,它总是会创建一个新的字符串对象,即使存在,它也不会引用池中的字符串对象。
当您调用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。
https://stackoverflow.com/questions/36370356
复制相似问题