除了命令行参数之外,我有以下代码可以工作,每次我写 "Insertion"
它都不会进入 if 语句,所以输出将是 “找不到算法。使用:[插入 | 合并]”
public static void main(String[] args) throws IOException, InsertionAndMergeException, Exception {
if( args.length < 2 ) {
System.out.println("Use: <path> <algorithm> ");
System.exit(1);
}
if(args[1] == "Insertion" || args[1] == "Merge"){
testWithComparisonFunction(args[0], args[1], new RecordComparatorIntField());
}else
System.out.println("Algorithm not found. Use: [ Insertion | Merge ]");
}
我在命令行中输入这个,我做错了什么?
java insertionandmergeusagejava/InsertionAndMer
geUsage "/home/zenoraiser/Scrivania/Università/Secondo Anno/Algoritmi/1718/LAB/Progetto/Integers.txt" "Insertion"
最佳答案
如果您将 if 语句更改为
,您会将==
与 .equals
混淆
if ("Insertion".equals(args[1]) || "Merge".equals(args[1])) {
您应该会得到预期的结果。
在 Java 中,==
操作获取 LHS 值并将其直接与 RHS 值进行比较,这适用于原始类型,例如 int
、 double
等。但是字符串有点不同。因为 String 实际上是一个字符数组,它存储为 Object
,所以 ==
运算符会将 指针 与 LHS 进行比较/RHS(在本例中不相等)。
您可以使用如下代码观察到看似奇怪的行为:
String a = "Test.";
String b = "Test.";
System.out.println(a == b); // true
System.out.println(a.toLowerCase() == b.toLowerCase()); // false
这是由于称为“字符串驻留”的过程,该过程有效地将多个字符串存储在同一个指针下,同时它们具有相同的值。
另请注意,通过将字符串字面量放在比较的第一位,您可以消除 NullPointerException
如果 args[1]
不存在的可能性。
关于来自终端奇怪行为的 Java 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49629105/