while循环中的代码不执行

时间:2009-11-04 17:07:47

标签: java

我正在玩Java并希望做一个简单的while循环,直到用户按下 ctrl + z

我有这样的事情:

public static void main(String[] args) {

    //declare vars
    boolean isEvenResult;
    int num;

    //create objects
    Scanner input = new Scanner(System.in);
    EvenTester app = new EvenTester();

    //input user number
    System.out.print("Please enter a number: ");
    num = input.nextInt();

    while() {

        //call methods
        isEvenResult = app.isEven(num);

        if(isEvenResult) {
            System.out.printf("%d is even", num);
        } else {
            System.out.printf("%d is odd", num);
        }

    }//end while loop

}//end main

我尝试while( input.hasNext() ) { ...但是while循环中的代码不会执行。

7 个答案:

答案 0 :(得分:3)

//input user number
System.out.print("Please enter a number: ");

do {
    try {
        num = input.nextInt();
    } catch (Exception e) {
        break;
    }
    // call methods
    isEvenResult = app.isEven(num);

    if (isEvenResult) {
        System.out.printf("%d is even", num);
    } else {
        System.out.printf("%d is odd", num);
    }
} while (true);

当用户写入非数字内容时,循环会中断。

答案 1 :(得分:1)

while(num!='z')

虽然如果你期望'z'为什么要做input.getInt()?

您也可以查看Console课程。

答案 2 :(得分:1)

如果要循环直到用户必须通过Ctrl + Z强制中断,那么只需执行while(true)。但是你希望你的nextInt()在循环中,也可能是你的提示语句。

答案 3 :(得分:1)

TrueSoft的解决方案已经过时了。它可能不适合提问者的原因有点超出了该计划的范围。

该程序适用于我:我在Linux下运行它并输入Ctrl-D作为第一行。 Ctrl-D是Linux的文件结尾,与Ctrl-Z适用于Windows的方式相同。程序完全停止在轨道上。

Windows控制台(黑色DOS框,无论你想调用它)都有皱纹:它逐行读取输入。在它读取行之前它不会看到Ctrl-Z,所以在它看到Ctrl-Z之前它需要一个Enter键。

我不愿意尝试启动Windows,但我的猜测是CTRL-Z后跟Enter键(就像数字条目之后一样)会导致程序干净利落。

有一些系统方法可以使Java程序逐个字符地工作,这样您就可以直接处理任何字符并立即响应Ctrl-Z。但这是高级的东西,并不属于这样的简单编程练习。我认为Ctrl-Z / Enter是让程序结束的可接受方式。

答案 4 :(得分:0)

您需要实施KeyBindings。然后,您可以根据按下的键确定退出。

答案 5 :(得分:0)

你正在循环外做输入,它只会运行一次。

System.out.print("Please enter a number: ");
num = input.nextInt();

将上面的代码放在循环中。

由于你在循环中有一个系统,你也会知道控件是否进入循环内部,显然它应该。

另外,试试

while(true)

我想知道是否只有()单独工作。

答案 6 :(得分:0)

这看起来像Deitel的书籍Java How to Program,第9版中的练习6.16。

CTRL-Z charcter确实在Windows平台上结束输入,就像CTRL-D在大多数UNIX或Linux平台上结束输入一样。

此外,在程序结构中存在逻辑错误,表明扫描程序方法和System.in字节流(即来自控制台的标准输入)未被很好地理解。

在您发布的程序中,声明:

    num = input.nextInt(); 

无条件执行。它将阻止执行,直到收到某种输入。如果输入不是整数,则会抛出异常。如果接收的输入是整数,则将为num分配整数值,并且将从输入流中丢弃输入流(输入)中的整数。输入行上可能有剩余的内容直到行尾,具体取决于用户在输入结束输入行的输入键之前键入的内容并将其放入Scanner正在扫描的System.in字节流中。

如果要将程序保留为写入程序,除了将input.hasNext()放入while语句的测试条件之外,它将阻塞,直到在nextInt()处理的整数之后输入流中有更多输入。

一些答案​​建议使用KeyBindings作为解决方案。虽然这可能有用,但它几乎在硬件级别上等待按键事件,并且对平台独立性不友好。这是进入爱丽丝仙境的一个潜在的漏洞,因为他必须弄清楚所有类型的事件处理以及代码必须知道它运行的平台。使用hasNext()boolean false返回来指示输入流的结尾应该可以在任何平台上运行,并且将避免在几乎硬件事件级别处理键盘和按键的潜在非便携式gee-whiz代码。

如果用户在Windows平台上按CTRL-Z或在UNIX / Linux平台上按CTRL-D而不必确定,则以下程序可以完成您(以及练习)的预期并将结束输入代码执行的平台。

// Exercise 6.16: EvenOrOddTest.java
// Write a method isEven that uses the remainder operator (%)
// to determine whether an integer is even. The method should
// take an integer argument and return true if the integer is
// even and false otherwise. Incorporate this method into an
// application that inputs a sequence of integers (one at a time)
// and determines whether each is even or odd.
import java.util.Scanner;

public class EvenOrOddTest {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int integer;
        System.out.println("Odd even integer test.");
        System.out.printf("Input CTRL-Z on Windows or CTRL-D on UNIX/Linux to end input\n"
            + "or an integer between values\n"
            + "%d and %d\n"
            + "to test whether it is odd or even: ",
            Integer.MIN_VALUE, Integer.MAX_VALUE);
        // the input.hasNext() will block until
        // some kind of input, even a CTRL-Z,
        // arrives in the stream
        // the body of the while loop will execute
        // every time input appears for as long as the input
        // is not a CTRL-Z
        while (input.hasNext()) { // repeat until end of input
            // prompt user
            // now see if the input we did get is an integer
            if (input.hasNextInt()) { // we got an integer...
                integer = input.nextInt();
                System.out.printf("\n%d is "
                        + (EvenOrOdd.isEven(integer) ? "even.\n\n" : "odd.\n\n"), integer);
            } else { // we got a non-integer one too large for int
                System.out.printf("\nInput %s invalid! Try again...\n\n", input.next());                
            } // end if...else
            // white space (i.e. spaces and tabs) are separators
            // next and nextInt get only to the first separator
            // so it is possible for the user to enter an integer
            // followed by tabs and/or spaces followed by more
            // input, integer or not up to the end of the input line
            // input.nextLine() flushes everything not processed 
            // by the nextInt() or next() to the input line end 
            // won't block execution waiting for input
            // if there is nothing left on the input line
            input.nextLine();
            // prompt for user input again
            System.out.printf("Input CTRL-Z to end input\n"
                    + "or an integer between values\n"
                    + "%d and %d\n"
                    + "to test whether it is odd or even: ",
                    Integer.MIN_VALUE, Integer.MAX_VALUE);
        } // end while
    } // end main

    static boolean isEven(int integer) {
        // integer modulus 2 is zero when integer is even
        return ((integer % 2) == 0);
    } // end isEven
} // end class EvenOrOddTest