java.lang.OutOfMemoryError:分配数组大小时的java堆空间
我正在用Eclipse开普勒IDE用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堆空间 我提出这个问题是为了理解它
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