OutOfMemoryError:尝试将5个int读入数组时的Java堆空间

时间:2017-02-07 13:55:48

标签: java out-of-memory

我正在练习Java新手采访编码示例。 我正在尝试编写一个程序来查找while not gameExit: for event in pygame.event.get(): if event.type == pygame.QUIT: gameExit = True 1之间的重复数字,其中N由用户和数字本身给出。 这是代码:

N

但我在Eclipse Neon中遇到以下错误:

import java.io.DataInputStream;
import java.io.IOException;

public class DuplicateNumbers {

    public static void main(String[] args) throws IOException {
        DataInputStream in = new DataInputStream(System.in);

        System.out.println(" Enter the number of numbers ");

        int a = in.readInt();
        int[] num = new int[a];
        System.out.println(" Enter the ints one by one ");
        for (int b = 0; b < a; b++) {
            System.out.println(" Enter no "+(b+1));
            num[b]=in.readInt();
        }
        int c = 0;
        for (int d = 0; d < a; d++) {
            int f = 0;
            c = num[d];
            for (int e=0; e<a; e++) {
                if (c==num[e]) {
                    f++;
                }
            }

            if(f > 1)
                System.out.println(" Duplicate number "+c);
        }
    }

}

有什么问题?为什么JVM堆空间错误? 代码编译并运行良好。

3 个答案:

答案 0 :(得分:20)

DataInputStream用于二进制而不是文本。键入4个字节时,会将其转换为32位int值,例如5,\ n,\ n,\ n大约是9亿,这就是为什么它在你创建数组时抱怨内存的原因。您可以通过逐步调试调试器中的代码来检查这一点。

您需要的是 text 输入,请尝试使用

Scanner in = new Scanner(System.in);
System.out.println("Enter the number of numbers");
int a = in.nextInt();
in.nextLine(); // discard the rest of the line.

答案 1 :(得分:5)

从这里开始:

DataInputStream in=new DataInputStream(System.in);

你不应该使用DataInputStream ......而且我看到你已经得到了解释。

但除此之外:

for(int e=0; e<a; e++)

你将立即遇到num [d]和num [e]相等。因为你的第二个循环实际上比较num [0]和num [0]。所以:第二个循环只需要在外部索引之后运行索引!

除此之外,如果您输入相同数字的50倍,还不清楚您是否真的需要50次“重复”。我宁愿去打印一个数字的数字重复项。

换句话说:在修复输入流问题之后,你的代码仍然没有做正确的事情。

除此之外:使用单字符名称几乎不可能轻易理解此代码的作用。

答案 2 :(得分:2)

请尝试为您的班级使用Scanner

这是一个基本的例子:

file.saveas2 = (filepath &"\folder\filename.pdf")