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。
答案 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
测试运行会给出相同的输出但在这种情况下这有点难看,在我看来......希望这可以帮助任何有同样问题的人。