首页 > 解决方案 > 如何将多个整数从 Bash shell 脚本传递到 Java System.in?

问题描述

我需要将两个整数从 Bash shell 脚本传递给我的 Java 程序。

这是我的Java代码。

import java.util.Scanner;

public class ConsoleApp {
  public static void main(String[] args) {
    int x = getInt();
    int y = getInt();
    System.out.println("x = " + x);
    System.out.println("y = " + y);
  }

  private static int getInt() {
    Scanner s = new Scanner(System.in);
    return s.nextInt();
  }
}

这里是 Bash 脚本,脚本的名称是run.sh.

#!/usr/bin/env bash

declare -r AppName=ConsoleApp

function compile() {
  javac $AppName.java
}

function execute() {
  echo 1 2 | java $AppName
}

compile; execute;
$ chmod a+x run.sh
$ ./run.sh

我执行后,会出现以下错误消息。

Exception in thread "main" java.util.NoSuchElementException
        at java.base/java.util.Scanner.throwFor(Scanner.java:937)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at ConsoleApp.getInt(ConsoleApp.java:13)
        at ConsoleApp.main(ConsoleApp.java:6)

现在,我知道它可以读取第一个整数x但无法读取第二个整数y

标签: javabash

解决方案


您必须对两个号码使用相同的扫描仪:

  Scanner s = new Scanner(System.in);
  int x = s.nextInt();
  int y = s.nextInt();
  System.out.println("x = " + x);
  System.out.println("y = " + y);

否则,第一个扫描器将消耗System.in比第一个数字更多的数据,并将剩余数据存储在内部缓冲区中以供进一步处理。如果您随后切换到另一台扫描仪,则数据丢失,新的扫描仪将再次读取,System.in但没有更多内容了。

或者,通过参数将两个数字作为命令行参数传递可能更容易args


推荐阅读