来自终端奇怪行为的 Java 输入

标签 java shell command-line args

除了命令行参数之外,我有以下代码可以工作,每次我写 "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/

相关文章:

batch-file - 批量命令行参数匹配

java - HttpServletRequest 字段可能不是静态的、最终的或有 Jersey 2 的注释类型错误

java - 在java3d中画线

JAVA pdfbox PDF 到非常简单的 HTML

multithreading - 在与OSX命令行不同的线程中运行程序?

java - 当我位于 Windows CMD 中的同一文件夹时,为什么必须为 .class 文件指定 Java 类路径?

java - hibernate,查询可嵌入对象

shell - 如何在 vim 中将当前缓冲区或行作为 stdin 发送到 system()?

bash - 使用带前缀的 bash 通配符

linux - Crontab 不运行 bash/sh 脚本的某些部分