我正在尝试打印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);
}
}
感谢。
答案 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.2
或abc...
,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...
}