【问题标题】:Java input from terminal strange behavior来自终端奇怪行为的 Java 输入
【发布时间】:2018-09-12 17:20:43
【问题描述】:

我有以下代码,除了命令行参数外,每次我写"Insertion"它都不会进入if语句,所以输出将是"Algorithm not found. Use: [ Insertion | Merge ]"

  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"

【问题讨论】:

  • 您比较错误的字符串。 == 是引用比较,需要按值比较,所以改用equals方法。只需更改此: if(args[1] == "Insertion" || args[1] == "Merge") 如下: if ("Insertion".equals(args[1]) || "Merge".equals (args[1]))
  • return;替换System.exit(1);

标签: java shell command-line args


【解决方案1】:

如果您将 if 语句更改为

,您会将 ==.equals 混淆
if ("Insertion".equals(args[1]) || "Merge".equals(args[1])) {

你应该得到预期的结果。

在 Java 中,== 操作获取 LHS 值并将其直接与 RHS 值进行比较,这对于 intdouble 等基本类型很好。不过,字符串有点不同。因为字符串实际上是一个字符数组,它被存储为Object,所以== 运算符会将 指针 与 LHS/RHS(在这种情况下不相等)进行比较.

您可以使用以下代码观察看似奇怪的行为:

String a = "Test.";
String b = "Test.";
System.out.println(a == b); // true
System.out.println(a.toLowerCase() == b.toLowerCase()); // false

这是由于一个称为“字符串实习”的过程,它有效地将多个字符串存储在同一个指针下,同时它们具有相同的值。

还请注意,通过在比较中将字符串文字放在首位,如果 args[1] 不存在,则可以消除 NullPointerException 的可能性。

【讨论】:

  • 你的意思是'字符串文字',而不是字符串常量
  • 包含String 实习是一个很好的补充。有关这方面的更多信息,请参阅 JLS 第 3.10.5 节:docs.oracle.com/javase/specs/jls/se10/html/…。正如 JLS 所引用的:“显式实习计算字符串的结果是与任何具有相同内容的预先存在的文字字符串相同的字符串。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多