扫描程序使用Java从命令行获取数据的麻烦

时间:2013-12-05 11:09:03

标签: java java.util.scanner

我承认,这是一项学校作业......但我根本无法弄清楚我做错了什么。

我有一个带插入函数的哈希表。以下代码应该采用格式为“Long String”的System.in中的一行数据(即“32452 John”)。对于ID号,第一个标记必须是Long,并且必须后跟名称的String标记。当我运行程序并且我到达必须执行的部分时(它在switch语句中),我输入'a'并按回车键。命令行会立即显示“无效值”。 (注意:不是VALUES,因为这意味着它会触及嵌套的if语句。它不会让我输入任何数据。提前谢谢!

System.out.println("Enter ID and Name.");
//temp to take in the next line entered by the user 
//inScan is the Scanner for System.in
temp = inScan.nextLine();
//Create Scanner for the line
Scanner tempScan = new Scanner(temp);
if(tempScan.hasNextLong()){
   thisID = tempScan.nextLong();
   if((tempScan.hasNext()) && (thisID>0)){
      thisName = tempScan.next();
     //The data will only be inserted if both segments of data are entered
      myTable.insert(new Student(thisID, thisName));
   }else{
      System.out.println("Invalid values.");
   }
}else{
   System.out.println("Invalid value.");
}

3 个答案:

答案 0 :(得分:0)

为什么需要第二个Scanner

示例

String input = scanner.nextLine();

String[] tokens = input.split(" ");
Long id = Long.parseLong(tokens[0]);
String name = tokens[1];

如果您想添加验证:

String input = scanner.nextLine();
if(input.contains(" ")) {
    // You know there's a space in it.
    String[] tokens = input.split(" ");
    if(tokens.length == 2) {
        // You know it's a value, followed by a space, followed by a value.
        if(tokens[0].matches("[0-9]+")) {
            // You know it only contains numbers. 
            Long id = Long.parseLong(tokens[0]);
        }
    }
}

答案 1 :(得分:0)

我没有运行它,但我猜你的问题是,当你输入文字'a'并点击回车时,这一行是假的:

if(tempScan.hasNextLong()){

因为你没有输入数字。因此它下降到下一个块。如果你先输入一些数字,我怀疑你的代码是有效的。你可能需要在它周围添加一个'while'循环,直到它得到一个数字。

答案 2 :(得分:0)

您已经有一个从System.in读取的扫描仪,不需要另一个。你做的第二个是String的扫描程序,它永远不会有nextLong,因为它在你的String后没有任何东西可以扫描。

我不会为您编写任何代码,因为这是作业,但在检查用户输入时会坚持使用原始扫描仪。