java.lang.OutOfMemoryError:分配数组大小时的java堆空间

java.lang.OutOfMemoryError:分配数组大小时的java堆空间,java,heap,out-of-memory,Java,Heap,Out Of Memory,我正在用Eclipse开普勒IDE用java编写一个非常小的程序 我使用以下语句在运行时分配数组的大小 unSortedArray = new int[sizeRow][sizeColumn]; 据我所知,java程序运行时有一些自己的堆空间,比如32MB 对于我的节目,我认为这个空间足够了 我刚刚在运行时给出了值sizeRow=3和sizeColumn=3 当我按下enter键时,它给出了以下异常java.lang.OutOfMemoryError:java堆空间 我提出这个问题是为了理解它

我正在用Eclipse开普勒IDE用java编写一个非常小的程序

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

unSortedArray = new int[sizeRow][sizeColumn];
据我所知,java程序运行时有一些自己的堆空间,比如32MB

对于我的节目,我认为这个空间足够了

我刚刚在运行时给出了值
sizeRow=3
sizeColumn=3

当我按下enter键时,它给出了以下异常
java.lang.OutOfMemoryError:java堆空间

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

我已经阅读了以下链接

编辑: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();
}
}
公共类数组排序
{
私有int[][]未排序的数组;
私有int sizeColumn,sizeRow;
私有最终DataInputStream DataInputStream=新DataInputStream(
系统(in),;
公共布尔getArraySize()引发IOException
{
尝试
{
System.out.print(“输入行的大小:”);
sizeRow=(dataInputStream.readInt());
System.out.print(“输入列的大小:”);
sizeColumn=dataInputStream.readInt();
返回false;
}
捕获(数字格式)
{
System.out.println(“为大小输入有效值:”);
}
返回true;
}
公共布尔getArrayElement()引发IOException
{
unSortedArray=newint[sizeRow][sizeColumn];
对于(int i=0;i

在我的情况下,我只调用这些方法一次。

如果违规代码如您所示,则有可能:

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

  • sizeRow
    sizeColumn
    的值与您认为的不同

我们无法在没有看到更多代码的情况下区分这两种可能性



更新-Andrey根据您更新的代码发现了问题。您读取的尺寸不正确,导致尺寸值不正确/非常大。这会导致应用程序尝试分配大量数组。。。这就是OOME。

如果违规代码如您所示,则有可能:

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

  • sizeRow
    sizeColumn
    的值与您认为的不同

我们无法在没有看到更多代码的情况下区分这两种可能性



更新-Andrey根据您更新的代码发现了问题。您读取的尺寸不正确,导致尺寸值不正确/非常大。这会导致应用程序尝试分配大量数组。。。这就是OOME。

如果违规代码如您所示,则有可能:

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

  • sizeRow
    sizeColumn
    的值与您认为的不同

我们无法在没有看到更多代码的情况下区分这两种可能性



更新-Andrey根据您更新的代码发现了问题。您读取的尺寸不正确,导致尺寸值不正确/非常大。这会导致应用程序尝试分配大量数组。。。这就是OOME。

如果违规代码如您所示,则有可能:

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

  • sizeRow
    sizeColumn
    的值与您认为的不同

我们无法在没有看到更多代码的情况下区分这两种可能性


更新-Andrey根据您更新的代码发现了问题。您读取的尺寸不正确,导致尺寸值不正确/非常大。这会导致应用程序尝试分配大量数组。。。这就是问题所在。

问题在于:

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

尝试使用
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;
    }    
    ...
}
问题在于:

dataInputStream.readInt()
这将从您的输入中读取一个二进制值,类似于2