Java Don';我不明白为什么代码会进入无限循环

Java Don';我不明白为什么代码会进入无限循环,java,Java,我正在努力学习Java,使用Scanner类一直很困难。我要做的是使用Scanner.nextInt()方法接受一个整数。除此之外,我还想检查输入是否为数字。如果没有,我想让用户再次输入 以下是我为完成此任务而编写的代码: do { System.out.print("Please enter Side 1:\t"); if(scanner.hasNextInt()) { d1=(double)scanner.nextInt(); i=0;

我正在努力学习Java,使用
Scanner
类一直很困难。我要做的是使用
Scanner.nextInt()
方法接受一个整数。除此之外,我还想检查输入是否为数字。如果没有,我想让用户再次输入

以下是我为完成此任务而编写的代码:

  do
  {
   System.out.print("Please enter Side 1:\t");

   if(scanner.hasNextInt())
   {
     d1=(double)scanner.nextInt();
     i=0;
   }
   else
   {
     System.out.print("Side shoud be a number!\t");
     i=1;
   }

  }
  while(i!=0);

不幸的是,这进入了一个无限循环,据我所知,它不会等待第二个循环中的“返回”。

您不会使用else分支中的错误输入,因此如果
scanner.hasnetint()
返回
false
,您将进入一个无限循环,因为在下一次迭代中会看到相同的扫描程序状态。

如果
scanner.hasnetint()
返回true,那么它应该可以工作,但当它返回false时,它将进入无限循环

这个怎么样:-

do
  {
   System.out.print("Please enter Side 1:\t");


  if(scanner.hasNextInt())
  {
   d1=(double)scanner.nextInt();
   i=0;

  }
   else
   {
   System.out.print("Side shoud be a number!\t");
   i=1;
   scanner.nextLine();
   }

  }
  while(i!=0);
或者尝试如下更改您的while循环:-

 while(i==0);

你会陷入无限循环,因为下一行的扫描器没有任何方法调用。请参见加粗线

    do {
        System.out.print("Please enter Side 1:\t");

        if(scanner.hasNextInt()) {  
            double d1=(double)scanner.nextInt();
            i=0;
        }

        else {
            System.out.print("Side shoud be a number!\t");
            i=1;
        }

        **scanner.nextLine();**
           }
    while(i!=0);

有些人似乎认为交换1或0是一个简单的错误,或者条件应该被翻转——但事实并非如此。如果你做了这个改变,那么即使你已经得到了一个数字,你也会得到持续不断的提示

您只希望在输入不是整数时继续提示,并在获得该整数时停止提示,对吗

我建议使用try-catch和一种形式的Parse方法,这样就可以清楚地了解您想要做什么

(此外,您的整数i不需要是整数-它可以是布尔值(true或false)。这也会使变量的意图更清楚。为好的代码命名好变量很重要。)

见此:

import java.io.*;                                                                   
import java.util.*;                                                                 

class Test {                                                                        
  public static void main(String args[]) {                                          
    Scanner scanner = new Scanner(System.in);                                       
    boolean done = false;                                                           
    double d1 = 0;                                                                  
    do {                                                                            
      System.out.print("Please enter Side 1:\t");                                   
      String next = scanner.next();                                                 
      try {                                                                         
        d1 = Double.parseDouble(next);                                              
        done = true;                                                                
      } catch (Exception e) {                                                       
        System.out.print("Side should be a number!\t");                              
      }                                                                             
    }                                                                               
    while(!done);   
    System.out.println("Number obtained: " + d1);                                                                
  }                                                                                 
}        

只有在您没有获得双倍奖励时,才会继续提示。一旦你得到了一个double,它就停止了。

大家好,我终于得到了它。我需要做的就是初始化循环中的scanner对象,这样每次循环执行时它都会等待,代码如下:

do
  {
   System.out.print("Please enter Side 1:\t");
  scanner=new Scanner(System.in);

  if(scanner.hasNextInt())
  {
   d1=(double)scanner.nextInt();
   i=0;

  }
   else
   {
   System.out.print("Side shoud be a number!\t");
   i=1;
   }

  }
  while(i==1);

感谢您的回复。

当它处于“无限循环”时,如果您键入一个数字并按enter键会发生什么?打印出扫描仪的内容以查看实际发生的情况。所需的只是hasNextInt为false。如果您在调试器中单步执行代码,您将能够自己解决它。注意:
scanner.hashNextInt()
在您的情况下,一旦启动,它将继续返回false。没有什么可以重置它。是的,我知道为什么它会进入无限循环,因为if条件在每个循环中都有相同的输入,根据我的说法,问题是扫描仪没有;不要等待“返回”,即用户在第二个循环中输入side,然后在一个适当的位置在
scanner.nextLine()
中的行。我得到了它,我初始化了循环中的scanner对象,现在它工作正常,无论如何,谢谢,它不会完成我想要的,当输入不是数字时,我希望它进入循环,这样新输入可以是一个数字,然后可能需要scanner.nextLine();另外,在你的问题陈述中,你说你想读一个整数,但是你把它存储在一个double中,所以我把它放在这里,这样你就可以读double了。可以很容易地将其更改为Integer.parseInt(可能是一个字符串)为了满足您的需要。虽然这不一定是好代码-您可能想看看我上面写的替代解决方案。是的,我在尝试hasInt方法之前尝试了try-catch方法,但当我使用try-catch时,它显示了scanner类中的一条系统消息,而我在catch循环中有一条简单消息,我会试试你的代码,看看它是否给出相同的结果