2017-02-26 8 views
0

リストからいくつかの値を読み込み、指定された長さのものだけを保持し、それぞれから3文字を抽出する単純なプログラムを作成しました。時間。我々はプログラムnick07n値を持っている場合たとえば"リストからの値チェック"プログラムのJavaヒープスペースエラー

が同じ位置から撮影と同じではないかもしれませんそれから3つのランダムな文字列を抽出する必要があります。プログラムが正常に動作しますが

n0n [0, 4, 6] 

を(私は「として)いくつかの結果を見てきた、すべての処理が終了するまで正常に実行されていないか、私は、次のメモリエラーを受け取るように、まったく実行されません。ここで

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.ArrayList.grow(Unknown Source) 
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) 
at java.util.ArrayList.ensureCapacityInternal(Unknown Source) 
at java.util.ArrayList.add(Unknown Source) 
at guessingTool.CheckProgram.main(CheckProgram.java:103) 

は、私が持っているコードは、これまでのところです:

for (int i = 0; i < 5; i++) { 

     index = randomGenerator.nextInt(valuesList.size()); 
     value = valuesList.get(index); 

     finalValue = ""; 
     positions.clear(); 
     for (int j = 0; j < 3; j++) { 
     index = randomGenerator.nextInt(value.length()); 
     valueChar = value.charAt(index); 
     positions.add(index); 

     if (j == 0) { 
      finalValue += Character.toString(valueChar); 
     } 
     else if (j == 1) { 
      if (positions.get(0) != positions.get(1)) { 
       finalValue += Character.toString(valueChar); 
      } 
      else { 
       while (positions.get(0) == positions.get(1)) { 
        index = randomGenerator.nextInt(value.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
       } 
      } 
     } 
     else if (j == 2) { 
      if (positions.get(0) != positions.get(2) && positions.get(1) != positions.get(2)) { 
       finalValue += Character.toString(valueChar); 
      } 
      else { 
       while (positions.get(0) == positions.get(2) || positions.get(1) == positions.get(2)) { 
        index = randomGenerator.nextInt(passcode.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
       } 
      } 
     } 

     } 
     System.out.println(finalValue + " " + positions); 
} 

どのような最適化方法がありますか、他に提案されている方法がありますか?

ありがとうございます。

+0

コードが 'while'ループの中に入ると、メモリが使い果たされるまでそこにとどまると思われます。 –

+0

これは私が思ったものですが、無限ループの原因となるコードのエラーや、条件を満たす正しいインデックスを見つけるために多量のメモリを消費しているためですか? –

+0

あなたは確かにあなたのコードに誤りがあります。 else if(j == 2)ブロックで最後のwhileループをデバッグしてください。私はこのループが無限に走っていると思います。 必要な変数やインポートを含むコード全体を投稿しなかったので、自分でデバッグすることはできません。 – DiabolicWords

答えて

0

最終的に私のコードでエラーを見つけることができました。あなたの答えをありがとう、彼らは私をたくさん助けました。誰もが言及したように、whileループ内に問題がありました。

else { 
    while (positions.get(0) == index) { 
      index = randomGenerator.nextInt(value.length()); 
    } 
    valueChar = value.charAt(index); 
    positions.add(index); 
    finalValue += Character.toString(valueChar); 
} 

今すぐプログラムが正しく動作します。これに

else { 
     while (positions.get(0) == positions.get(1)) { 
      index = randomGenerator.nextInt(value.length()); 
      valueChar = value.charAt(index); 
      positions.add(index); 
     } 
}  

は、私はこれを変更しました。

2

私はあなたの問題は、このようになりますあなたのコードの一部から来ていると思う:

while (positions.get(0) == positions.get(1)) { 
        index = randomGenerator.nextInt(value.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
    } 

条件が真の場合はどうなります、あなたは位置リストインデックス(の末尾に追加していることですpositions.add(index)はインデックスをプッシュしません。単にリストの末尾に追加されます)、条件はまだ成立していますので、無限ループがあり、リストに要素が増えていきます。それらのすべてを保持するのに十分なヒープがないことを指摘してください。 Javadocを参照してくださいhttps://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)

関連する問題