【问题标题】:OutOfMemoryError: Java heap space when trying to read 5 ints into an array [duplicate]OutOfMemoryError:尝试将 5 个整数读入数组时的 Java 堆空间 [重复]
【发布时间】:2017-02-07 13:55:47
【问题描述】:

我正在练习 Java 较新的面试编码示例。 我正在尝试编写一个程序来查找1N 之间的重复数字,其中 N 由用户和数字本身一起给出。 代码如下:

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);
        }
    }

}

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

Enter the number of numbers 
5

Exception in thread "main" java.lang.OutOfMemoryError: 
Java heap space at DuplicateNumbers.main(DuplicateNumbers.java:14)

怎么了?为什么JVM堆空间错误? 代码编译运行良好。

【问题讨论】:

  • 嗯,它没有 “运行良好”,这就是你在这里询问异常的原因......它是否在line int[] num=new int[a]; 你试过加断点调试代码吗?
  • 你从哪里了解到 DataInputStream 是如何读取用户输入的?
  • 不,先生,我不是要复制任何人的代码。我只是有一个要练习的程序列表,我尝试自己编写代码,当我用尽逻辑和耐心时,我会寻求帮助。
  • 仅作记录:您仍然可以接受其中一个答案;以防您发现它们足够有用 ;-)

标签: java out-of-memory


【解决方案1】:

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

你需要的是文本输入,试试用

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.

【讨论】:

  • 快速而出色的评论:)
【解决方案2】:

从这里开始:

DataInputStream in=new DataInputStream(System.in);

您不应该使用 DataInputStream ... 我看到您已经对此进行了解释。

但除此之外:

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

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

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

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

除此之外:您使用单字符名称几乎不可能轻松理解这段代码在做什么。

【讨论】:

  • 是的,我通过 if(f>1) 纠正了“flag-upon-first-match”故障
  • 当然,这行得通;但这是错误的做法。不要期望“损坏的数据”来修复它 - 首先防止“损坏的数据”出现!
  • 输入前的意思是规划代码?先生,您能详细说明一下吗?专业程序员在编码之前做“粗活”吗?现实生活中的发展是如何发生的?请告诉我,以便我改进。
  • 我的意思是:您更改了 if() 子句以检查 > 1。即“修复损坏的结果”。我的解决方案是防止 num[0] 与自身进行 first 比较。换句话说:而不是检查 f > 1;确保仅当您在数组的 不同 个插槽中发现重复数字时才增加 f。
  • 好的:)我应该使用更好的标记技术。
【解决方案3】:

请尝试为您的班级使用Scanner

这是一个基本的例子:

public static void main(String[] args) throws IOException 
    {
        System.out.println("Enter a number: ");
        Scanner sc = new Scanner(System.in);
        String item = sc.next();
        System.out.println("Your item is: " + item);
        sc.close();
    }

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多