JAVA程序即使在不应接受输入的情况下也始终阻止终端输入

时间:2019-03-22 16:36:31

标签: java

所以我调试了问题的根源。基本上,我正在运行一些测试用例,

 int no_of_test = Integer.parseInt(in.readLine());
 for(int t = 0;t<no_of_test;t++){//do something}`

工作正常。但是,

for(int t=0;t<Integer.parseInt(in.readLine());t++){//do something}

这里,每次迭代后它一直等待输入。

在python中,我可以做for t in range(int(input()),并且每次迭代后它都不会阻塞输入,为什么在JAVA中不是这样?我想念什么?

5 个答案:

答案 0 :(得分:2)

它一直在等待,因为第二条语句是在每次迭代之前都要检查的条件。

for(int t=0; t<Integer.parseInt(in.readLine()); t++)
  • 声明1:在循环开始之前设置一个变量(int t = 0)。

  • 声明2:定义循环运行的条件。如果条件为true,则循环将重新开始;如果条件为false,则循环将结束。

  • 声明3:每次执行循环中的代码块时,都会增加一个值(t ++)。

循环可以结束的唯一情况是,您不输入就会一直等待很长时间,直到您输入一个,所以这是一个永无止境的循环。

如果您仍想结束循环,请输入非数字的内容。

答案 1 :(得分:1)

使用

for(int t=0;t<Integer.parseInt(in.readLine());t++){//do something}

每次迭代都会重新评估Integer.parseInt(in.readLine())件。

鉴于

int no_of_test = Integer.parseInt(in.readLine());
for(int t = 0;t<no_of_test;t++){//do something}

Integer.parseInt(in.readLine())仅被评估一次。

答案 2 :(得分:1)

有不同的代码构造。

在Python示例range()中是函数。它被调用一次并返回整数序列。因此,循环遍历值的序列。

在Java示例t < Integer.parseInt(in.readLine())中是循环条件,必须为每次迭代检查它。您的python代码的Java类似物可以是:

IntStream.range(0, Integer.parseInt(in.readLine())).forEach((e) -> {
    //...
});

答案 3 :(得分:0)

在第一种情况下,您在循环外执行in.read() 在第二种情况下,您在循环执行中获得了in.read()

请记住,循环条件是在每次迭代时求值的,因此您在每次迭代时都处于in.read状态。

也许您想这样做

for(int t=0,tests=<Integer.parseInt(in.readLine());t<tests;t++) {body}

答案 4 :(得分:0)

根据Java Language Specification

BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
     for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
     StatementExpressionList
     LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression
     

14.14.1.2。 for语句的迭代

     

接下来,执行for迭代步骤,如下所示:

     

如果存在表达式,则对其进行评估。如果结果是   类型为Boolean,则需要进行拆箱转换(第5.1.8节)。

换句话说,t < Integer.parseInt(in.readLine())在循环的每次迭代中执行一次。

Java Tutorial中有更好的解释:

  

for语句提供了一种紧凑的方法来迭代一系列   价值观。程序员经常将其称为“ for循环”,因为   重复循环直到特定条件发生的方式   满意。 for语句的一般形式可以表示为   如下:

for (initialization; termination; increment) {
    statement(s) }
     

使用此版本的for语句时,请记住:

     
      
  • 初始化表达式初始化循环;它会在循环开始时执行一次。
  •   
  • 当终止表达式的计算结果为false时,循环终止。
  •   
  • 在每次循环迭代之后调用增量表达式;该表达式增加或   递减值。
  •   

如果您想要类似于for t in range(int(input())的内容,则可以使用Streams API:

import static java.lang.Integer.parseInt;
import static java.lang.System.console;

// option 1
try (final BufferedReader console = new 
           BufferedReader(new InputStreamReader(System.in))) {
  IntStream.range(0, parseInt(console.readLine())).forEach(i -> {
    System.out.println(i);
  });
}

// option 2 (fails in some IDEs as console() will return null)
IntStream.range(0, parseInt(console().readLine())).forEach(i -> {
  System.out.println(i);
});