0

我正在使用 Eclipse Kepler IDE 在 java 中执行非常小的程序。

我使用以下语句在运行时分配数组的大小。

unSortedArray = new int[sizeRow][sizeColumn];

所以据我所知,java程序运行时有一些自己的堆空间,比如32 MB。

对于我的程序,我认为这个空间就足够了。

我只是在运行时sizeRow=3给出了值。sizeColumn=3

当我按下回车时,它给出了以下异常java.lang.OutOfMemoryError: Java heap space

我提出这个问题是为了了解它为什么会发生以及我们如何处理它?

我已经阅读了以下链接。

java.lang.OutOfMemoryError:Java 堆空间

如何处理“java.lang.OutOfMemoryError: Java heap space”错误(64MB 堆大小)

编辑:1

public class ArraySort
{
private int[][]                 unSortedArray;
private int                     sizeColumn, sizeRow;

private final DataInputStream   dataInputStream = new DataInputStream(
                                                        System.in);

public boolean getArraySize() throws IOException
{
    try
    {
        System.out.print("Enter the size of the row:");
        sizeRow = (dataInputStream.readInt());
        System.out.print("Enter the size of the column:");
        sizeColumn = dataInputStream.readInt();
        return false;
    }
    catch (NumberFormatException e)
    {
        System.out.println("Enter valid value for size:");
    }
    return true;
}

public boolean getArrayElement() throws IOException
{
    unSortedArray = new int[sizeRow][sizeColumn];
    for (int i = 0; i < sizeRow; i++)
    {
        for (int j = 0; j < sizeColumn; j++)
        {
            try
            {
                System.out.println("Enter Element [" + i + "," + j + "]");
                unSortedArray[i][j] = dataInputStream.readInt();
            }
            catch (NumberFormatException ne)
            {
                System.out
                        .println("Enter proper Numeric value for Array Element");
                return true;
            }
        }
    }
    return false;
}
}


public class ArraySortProgram
{

public static void main(String[] args) throws IOException
{
    ArraySort arraySort = new ArraySort();

    arraySort.getArraySize();
    arraySort.getArrayElement();
}
}

就我而言,我只调用这些方法一次。

4

2 回答 2

2

问题在这里:

dataInputStream.readInt()

这将从您的输入中读取一个二进制值,对于您输入的“1251”,该值类似于 2323827382,从而导致 OOM。

尝试使用Scanner这样读取您的整数:

public class ArraySort{
    private final Scanner scanner = new Scanner(System.in);

    int sizeRow, sizeColumn;

    public boolean getArraySize() throws IOException
    {
        try
        {
            System.out.print("Enter the size of the row:");
            sizeRow = (scanner.nextInt());
            System.out.print("Enter the size of the column:");
            sizeColumn = scanner.nextInt();
            return false;
        }
        catch (NumberFormatException e)
        {
            System.out.println("Enter valid value for size:");
        }
        return true;
    }    
    ...
}
于 2013-10-26T07:57:39.240 回答
1

如果违规代码如您向我们展示的那样,那么有可能:

  • 在执行此语句之前,您已经分配了其他对象,并且您已经消耗了几乎所有的可用空间。这句话是压垮骆驼的那根众所周知的稻草。

  • sizeRow和的值sizeColumn不是您认为的那样。

如果不查看更多代码,我们无法区分这两种可能性。


更新- 安德烈根据您更新的代码发现了问题。您读取的尺寸不正确,导致尺寸值不正确/非常大。这导致您的应用程序尝试分配一个巨大的数组数组......这给了OOME。

于 2013-10-26T06:43:53.987 回答