在循环中卡在里面

时间:2016-12-30 12:30:53

标签: java

我正在尝试打印z的值作为输出但是我的代码没有完成执行..它到达“此处”行,但从未到达最后一行“z is”。

我猜是 s = sc.nextInt(); 是问题所在。

public class Solution {

public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    int x = 0;
    int y = 0;
    int z = 0;
    int u = 0;
    int n = sc.nextInt();
    int s = sc.nextInt();
    while(sc.hasNextInt()) {
        if(s != -1){
            y = s;
            if(sc.hasNextInt()){
                s = sc.nextInt();                 
            }
        }     
        while(s == -1){
            x++;
            System.out.println("s is "+s);
            z = Math.abs(y - x) + u;
            System.out.println("s is "+s);
            System.out.println("x is " + x+ " y is "+ y+" z is "+z);
            if(sc.hasNextInt()){
                s = sc.nextInt();                 
                System.out.println("s33 is "+s);
            }
        }
        if(z != 0){
            u = z;
        }    
        x = 0;
        y = 0;
        System.out.println("here");
    }
    System.out.println("z is" +z);
    }
}

感谢。

2 个答案:

答案 0 :(得分:1)

它不会进入无限循环,而是你已经在Scanner中存储了两个值,你用hasNextInt()检查它们。因此它始终是真的并等待下一个输入检查。如果你输入Int值,它将在while循环中相同。输入非整数(如String)以退出while循环,程序将结束。 实际上,您正在等待两个while循环中的输入,因此它等待您的输入。

答案 1 :(得分:0)

问题

您在系统输入流Scanner上使用System.in。这意味着sc.hasNextInt()尝试从基础流中获取下一个值,即System.in。但是,此流只会提示您输入新内容并将其返回Scanner。一旦Scanner收到换行符,它就会检查前面的序列是否为int。如果您仅按Enter ,则序列为空,因此会被忽略。如果你反复按Enter键不是无限期执行的循环,你的代码卡在sc.hasNextInt(),没有新标记(因为空序列),并询问底层一次又一次地流。

但是,如果您输入int以外的任何内容,例如0.2abc...Scanner将返回false,因为序列为不是空的不是int

解决方案

如果您希望保持代码不变,并且希望当您按Enter键时hasNextInt()返回false(仅限换行符),则可以将Scanner包装在此包装器中:

import java.util.Scanner;

public class ScannerWrapper {

    private Scanner scanner;
    private Integer current;

    public ScannerWrapper(Scanner scanner) {
        this.scanner = scanner;
    }

    public boolean hasNextInt() {

        // Current is not null, if method is called multiple
        // times, the value was checked already, it is an integer
        if (current != null) {
            return true;
        } else {

            // Reads line including newline character
            String nextLine = scanner.nextLine();

            try {
                // Try to covert the input to an integer
                current = Integer.parseInt(nextLine);
                return true;
            } catch (NumberFormatException e) {
                // Input is not an integer
                return false;
            }

        }
    }

    public int nextInt() {

        // Used the already checked value or request new input
        if (current != null) {
            int next = current;
            current = null;
            return next;
        } else {

            int next = scanner.nextInt();

            // Consume the newline character
            scanner.nextLine();

            return next;

        }
    }

}

如果可能,此类会读取完整的行并将其转换为int。由于您无法推回使用Scanner读取的最后一个令牌,因此该类会临时存储它,因此对hasNextInt()的多次调用不会跳过值。在你的方法中只需添加:

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    ScannerWrapper sc = new ScannerWrapper(scanner);

    int x = 0;
    // Rest of your code...

}