我使用Eclipse Kepler IDE在java中执行非常小的程序。
我使用以下语句在运行时分配数组的大小。
unSortedArray = new int[sizeRow][sizeColumn];
据我所知,java程序运行时有一些自己的堆空间,如32 MB。
对于我的程序,我认为这个空间已经足够了。
我刚刚在运行时给出了值sizeRow=3
和sizeColumn=3
。
当我按下输入时,会出现以下异常 java.lang.OutOfMemoryError: Java heap space
我提出这个问题,以了解它为什么会发生以及我们如何处理它?</ p>
我已阅读以下链接。
java.lang.OutOfMemoryError: Java heap space
How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)
修改: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();
}
}
在我的情况下,我只调用这些方法一次。
答案 0 :(得分:2)
问题在于:
dataInputStream.readInt()
这将读取您输入的二进制值,如果输入的“1251”导致OOM,则为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;
}
...
}
答案 1 :(得分:1)
如果违规代码如您所示,那么有可能:
在执行此语句之前,您已经分配了其他对象,并且您已经消耗了几乎所有可用空间的。这句话是打破骆驼背后的谚语。
sizeRow
和sizeColumn
的值不是您认为的值。
如果不了解更多代码,我们无法区分这两种可能性。
更新 - 安德烈根据您更新的代码发现了问题。您正在错误地读取尺寸,导致尺寸值不正确/非常大。这导致您的应用程序尝试分配一个巨大的数组数组......这给了OOME。