Netbeans - input.hasNext()在按下ctrl + z时什么都不做

时间:2011-01-20 00:55:18

标签: java netbeans-6.9

while ( input.hasNext() ) {
            i = input.nextInt();
            //System.out.println();
            System.out.print("Bla: ");            
        }

这只是一个测试应用/代码。当我按下ctrl + z时,我只听到 ding Windows声音(也就是说你做错了声音<。<)并没有任何反应,程序继续正常运行。我在另一个应用程序中测试它并且input.hasNext()确实返回正确的True布尔值,它只是不能识别Ctrl + Z.使用Netbeans 6.9.1和Windows 7。

4 个答案:

答案 0 :(得分:1)

CTRL-Z确实在Windows 7平台上的System.in的控制台输入流中结束输入。

有助于理解其工作方式。大量的Scanner方法,特别是hasNext ...和next ...方法,阻止执行,直到Scan.Object对象实例化的System.in字节流中出现某些内容。一旦有某种输入,这些方法将在广告时解锁并继续进行。

如果输入是输入流的结尾(即Windows中的CTRL-Z,UNIX / Linux中的CTRL-D),则hasNext ...方法将返回布尔值false。如果hasNext ...特定于基元或其他类型,只有当输入解析为hasNext ...测试的有效原语或对象类型时,它才会返回布尔值true,否则它将返回false。

在hasNext()的情况下,它不是原始的或对象特定的,因此除输入流的结尾之外的任何输入都将返回true。这使得它对于这个问题暗示的那种决定非常有用。

以下代码适用于Windows 7旗舰版平台,而不是nextInt()方法,它使用更通用的nextLine()方法来演示其工作原理。 nextInt()方法将用户限制为整数,如果输入的结尾或者对于int原语不太大的整数输入,则会抛出异常。此代码将回显用户输入的内容,直到输入结束字符为止。

// ControlZEndInputTestApp.java
// Demonstrate how end of input
// works with Scanner.hasNext() method

import java.util.Scanner; 

public class ControlZEndInputTestApp {

    public static void main(String[] args) { 
        Scanner input = new Scanner(System.in); 
        // hasNext() blocks until something appears in the System.in
        // byte stream being processed by Scanner or an end of stream
        // occurs which is CTRL-Z in Windows and CTRL-D in UNIX/Linux
        // When hasNext() unblocks, it returns boolean false
        // if the stream ended or boolean true if the input was anything else
        // other than an end of input stream
        // repeat as long as we don't receive an end of input
        // i.e. CTRL-Z on Windows or CTRL-D on UNIX/Linux...
        while ( input.hasNext() ) { 
              System.out.println(input.nextLine());
        }
    }
}

答案 1 :(得分:1)

对于那些在IDE中工作的人,我们都可以获得与Deital训练示例相同的结果。 IDE屏蔽“CTRL z”,因此它似乎不起作用。如果从命令行运行它,它将起作用。为了培训课程的目的,并允许您继续对示例的其余部分感到满意​​,将“input.hasNext”替换为“input.hasNextInt”。您也可以尝试其他代码。当你运行它时,只需输入一个字符并按回车键即可,而不是输入“CTRL z”。

    //loop until user enters the end-of-file indicator
    // or in this case . a non numeric character
    while ( input.hasNextInt()  )
    {
       grade = input.nextInt(); // read grade
       total +=grade;           // add grade to total
       ++gradeCounter;          // increment number of grades

       // call method to increment appropriate counter
       incrementLetterGradeCounter( grade );
    }   // end while
} // end method inputGrades

答案 2 :(得分:0)

package testapp;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        int i;

        while ( input.hasNext() ) {
            i = input.nextInt();
            //System.out.println();
            System.out.print("Bla: \n");
        }
    }
}

这是整个代码。我理解这个应用程序根本不做任何有用的事情,我只是想看看hasNext是如何工作的,而事实并非如此。 Ctrl + Z什么都不做。

答案 3 :(得分:0)

这里出现的问题是input.hasNext()无论键盘输入是什么都会评估为真。当用户的输入不是整数时,需要终止上面给出的程序。因此,您可以在input.hasNextInt()语句中使用布尔while(...)。当下一个标记是整数时返回true,但当非整数标记作为输入给出时返回false。这是一个非常直接的解决方案(上面也提出了但可能不太清楚)。通常,当您按下CTRL + z或CTRL + d等组合键时,您不希望程序终止(仅当您从终端运行程序时才可以这样做)。这个简单解决方案中的代码如下所示:

import java.util.Scanner;

public class StackO_4742445 {


static Scanner input = new Scanner(System.in);


public static void main(String[] args) {

    int i;

    while ( input.hasNextInt() ) {

        i = input.nextInt();

        System.out.print("Bla: \n");    
    } 


  }
}

测试运行会在NetBeans 8.1中为您提供此输出

  run:
  1
  Bla:  
  2
  Bla: 
  3
  Bla: 
  d
  BUILD SUCCESSFUL (total time: 8 seconds)

因此,当您按下字母d或任何其他不是整数的键时,while循环终止时可以看到。

现在,如果仍然想在.hasNext()内使用while(...)方法,则可以 可以使用if() {}语句和break;循环,如下所示

   int i;


    while ( input.hasNext() ) {

        if (input.hasNextInt())  {

        i = input.nextInt();

        System.out.print("Bla: \n");            

        }//if ends here

        else {break;}

    }//while loop ends here

测试运行会给出相同的输出但在这种情况下这有点难看,在我看来......希望这可以帮助任何有同样问题的人。