【问题标题】:Bug :- Scanner class asks for input infinite times错误:- 扫描器类要求输入无限次
【发布时间】:2019-03-31 05:25:51
【问题描述】:
import java.util.*;
public class Composite_Magic
{
    public static void main()
    {
        int i,j,m,n,fact=0,sum=0,temp=0;
        boolean k=false;
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter 2 numbers as upper and lower bound and all composite numbers between them will be displayed");
        m=sc.nextInt();
        n=sc.nextInt();
        sc.close();
        if(m<n){
            for(i=m;i<=n;i++)
            {
                for(j=1;j<=i;j++)
                {
                    if(i%j==0)
                        fact++;
                }                    
                sum=i;
                while(k==false)
                {
                    temp=sum;
                    while(temp>0)
                    {
                        sum=sum+(temp%10);
                        temp=temp/10;
                    }
                    if(sum/10==0)
                        k=true;
                }
                if(sum==1 && fact>2) 
                    System.out.println(i);
            }
        }
        else
            System.out.println("Invalid Input");
    }
}

所以我只要求输入两次,但并没有停止。

这是我犯的错误还是错误?

这是我的完整程序。

This is the screenshot of the terminal window

【问题讨论】:

  • 可以分享剩余的代码吗?
  • 您在控制台中输入的内容是什么
  • 你的main()方法在哪里调用?
  • 只要您不关闭扫描仪,它就会要求输入。
  • 我没有在程序的其他任何地方调用我的 main() 方法。我在类选项中使用 void main() 来运行它。

标签: java input java.util.scanner infinite


【解决方案1】:

只是这个循环:

        while(k==false)
        {
            temp=sum;
            while(temp>0)
            {
                sum=sum+(temp%10);
                temp=temp/10;
            }
            if(sum/10==0)
                k=true;
        }

似乎永远不会结束。
我不知道你想用它做什么,但k 不会变成true
否则会花费很多时间。
在此期间,您认为系统提示您提供新号码,但您没有
您只需输入并按回车即可。
为了证明这一点,只需输入ppp。这应该抛出 InputMismatchException 但它不会。

【讨论】:

  • 我刚刚发现问题出在这个循环上。该循环用于检查数字是否为幻数。你能帮我解释一下逻辑吗?
  • 我发现了错误,现在我需要帮助解决它。
  • @AdityaSoni 这是另一个问题。这个问题的问题就解决了。现在您应该发布另一个标题为另一个问题的问题,并提供有关您要达到的目标以及错误在哪里的所有相关信息
  • 我应该删除这个问题,因为它没用吗?由于我的愚蠢,它已经有-2了。
  • @AdityaSoni 我不认为它没用,但这是你的问题,你可以用它做任何你想做的事情。
【解决方案2】:

您必须使用sc.close(); 关闭扫描仪 但是你的循环仍然存在问题我已经使用我自己的代码重新植入了代码,现在应该可以工作了。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter 2 numbers as upper and lower bound and all composite numbers between them will be displayed");
    int m = sc.nextInt();
    int n = sc.nextInt();
    sc.close();
    if (m < n) {
        for (int i = m; i <= n; i++) {
            int f = 0;
            for (int i2 = 1; i2 <= n; i2++) {
                if (n % i2 == 0)
                    f++;
            }
            if (f > 2) {
                int num = i;
                do {
                    num = sumOfDigits(num);
                } while (num > 9);
                if (num == 1) {
                    System.out.println(i);
                }
            }
        }
    } else {
        System.out.println("Invalid Input");
    }
}

public static int sumOfDigits(int n) {
    int s = 0;
    while (n > 0) {
        s += n % 10;
        n /= 10;
    }
    return s;
}

输出

10
19
28
37
46
55
64
73
82
91
100

【讨论】:

  • 你能试试输入 10 和 100 并告诉我输出是什么吗?是我的 JDK 有问题吗?
  • 您的问题是关闭扫描仪而不是输出。
  • 好吧,看起来 10 和 100 创建了一个无限循环,你能告诉我你要在这里计算什么吗?
  • 那么为什么 Scanner 不自行关闭,它对您有什么作用?我以前从未使用过 sc.close()。
  • 我尝试使用数字 1 和 2。循环发生在您的计算中。
猜你喜欢
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多