while循环中的java代码不执行

m1m5dgzv  于 2021-06-30  发布在  Java
关注(0)|答案(7)|浏览(509)

我正在玩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循环中的代码不会执行。

ua4mk5z4

ua4mk5z41#

您需要实现键绑定。然后,您可以根据所按的键来决定退出。

q3aa0525

q3aa05252#

truesoft的解决方案已经过时了。它不适用于asker的原因有点超出了程序的范围。
这个程序适合我:我在linux下运行它,并在一行中输入ctrl-d。对于linux,ctrl-d是文件的结尾,就像对于windows,ctrl-z是一样的。程序完全停止运行。
windows控制台(黑色dos框,不管你怎么称呼它)有一个缺点:它逐行读取输入。在读取行之前,它不会看到ctrl-z,因此在看到ctrl-z之前,它需要一个回车键。
我不愿意启动windows只是为了尝试这个,但是我的猜测是ctrl-z后跟enter键(就像数字输入之后一样)应该会导致程序完全停止。
有一些system-y方法可以使java程序逐个字符地工作,这样您就可以直接处理任何字符并立即响应ctrl-z。但这是先进的东西,不属于像这样一个简单的编程练习。我认为ctrl-z/enter是一种可以接受的结束程序的方法。

voase2hg

voase2hg3#

这看起来像是deitel的书java how to program第9版中的练习6.16。
实际上,在windows平台上,ctrl-z字符结束输入,就像在大多数unix或linux平台上,ctrl-d结束输入一样。
此外,在程序的构造中也存在逻辑错误,这些错误表明扫描器方法和字节流中的系统(即来自控制台的标准输入)没有被很好地理解。
在您发布的程序中,声明:

num = input.nextInt();

无条件执行。它将阻止执行,直到收到某种输入。如果输入不是整数,它将抛出异常。如果接收到的输入是整数,那么num将被分配整数值,并且输入流(input)中的整数将从输入流中丢弃。输入行到行尾可能有剩余的内容,这取决于用户在按结束输入行并将其放入系统的enter键之前键入的内容。在扫描仪正在扫描的字节流中。
如果除了将input.hasnext()放入while语句的测试条件之外,程序保持编写状态,那么它将阻塞,直到nextint()处理的整数之后的输入流中有更多的输入。
一些答案建议使用键绑定作为解决方案。尽管这可能有效,但它几乎在硬件级别等待按键事件,对平台独立性不友好。这是一个潜在的兔子洞爱丽丝梦游仙境必须弄清楚各种各样的事件处理和代码必须知道它运行在什么平台上。使用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
5ktev3wc

5ktev3wc4#

您在循环外执行输入,它将只运行一次。

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

将上述代码放入循环中。
因为你在循环中有一个系统,你也会知道控件是否进入了循环,显然它应该。
另外,试试看

while(true)

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

v6ylcynt

v6ylcynt5#

如果您想循环直到用户必须通过ctrl+z强制中断,那么只需这样做 while(true) . 但是你想要你的 nextInt( )在循环中,也许还有你的提示语句。

bjp0bcyl

bjp0bcyl6#

//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);

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

ohfgkhjo

ohfgkhjo7#

while(num!='z')
如果你期望一个“z”,为什么要做input.getint()?
你也许想看看 Console 上课也是。

相关问题