0

Eclipse Kepler IDE を使用して Java で非常に小さなプログラムを実行しています。

次のステートメントを使用して、実行時に配列のサイズを割り当てています。

unSortedArray = new int[sizeRow][sizeColumn];

私の知る限り、Javaプログラムは32 MBのような独自のヒープスペースで実行されます。

私のプログラムでは、このスペースで十分だと思います。

実行時に値sizeRow=3を指定しただけです。sizeColumn=3

そして、Enterキーを押すと、次の例外が発生します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

問題のあるコードがあなたが私たちに示したものである場合、可能性があります:

  • このステートメントを実行する前に、他のオブジェクトを割り当てており、使用可能な領域のほぼすべてを消費しています。この声明は、ラクダの背中を折る、ことわざのわらです。

  • との値はsizeRowsizeColumnあなたが思っているものではありません。

これら 2 つの可能性を区別するには、コードをもっと見る必要があります。


更新- Andrey は、更新されたコードに基づいて問題を発見しました。サイズを誤って読み取っているため、サイズの値が正しくないか、非常に大きくなります。これにより、アプリケーションは配列の巨大な配列を割り当てようとします...これにより、OOME が発生します。

于 2013-10-26T06:43:53.987 に答える