2016-11-17 26 views
-1

このStackOverFlowエラーが発生しましたが、完全に理解していますが、大きなデータを扱っていないという問題があります。stack = java.lang.StackOverflowError:スタックサイズ8MB

私は、Framelayoutの断片、3つのオプションを持っています。

これらのオプションの1つをクリックすると、フラグメントが再作成され、乱数が入力されます.MAXは15です。その大きさではないため、このエラーは、このオーバーフローを引き起こすオプション。

これは「強化」するためのアイデアを生成するためのコードですか?私はこのコードがmomeryを使用するための悪い習慣であるかどうかわかりません。

private static List<Integer> SavedNumbers; 

public static void SetupSavedNumbersLIst(){ 
    SavedNumbers = new ArrayList<>(); 
} 


static List<Integer> range; 
private static void AddDiff(int mMAX){ 
    range = new ArrayList<>(); 
    for(int i = 0 ; i < mMAX ; i++){ 
     range.add(i); 
    } 

    range.removeAll(SavedNumbers); 
} 

private static int ReturnIfDuplic(int mMAX){ 
    AddDiff(mMAX); 
    return new Random().nextInt(range.size()); 
} 


public static int ReturnUniqueSavedNumber(int mMAX){ 
    int Random = ReturnRandom(mMAX); 
    if(SavedNumbers != null && SavedNumbers.size() > 0) { 
     if(DoesSavedNumberExist(Random)){ 
      return ReturnIfDuplic(mMAX); 
     } else { 
      SavedNumbers.add(Random); 
      return Random; 
     } 
    } else if (SavedNumbers != null && SavedNumbers.size() == 0){ 
     SavedNumbers.add(Random); 
     return Random; 
    } else if(SavedNumbers == null){ 
     SetupSavedNumbersLIst(); 
     return ReturnUniqueSavedNumber(mMAX); 
    } else { 
     return 1; 
    } 
} 

private static boolean DoesSavedNumberExist(int Number){ 
    for(int s: SavedNumbers){ 
     if(Number == s) 
      return true; 
    } 
    return false; 
} 

private static int ReturnRandom(int mMAX){ 
    return new Random().nextInt(mMAX); 
} 
+0

...新しいRandom()。nextInt()は永遠の命のために同じ番号を生成する可能性があります...必要なintのリストを作成してシャッフルしてくださいhttp://ideone.com/ XJRRba – Selvin

+0

コードから、私は重複のない範囲で乱数を生成するための代替アプローチとして見ることができます。このメソッド(乱数を生成する)はフラグメントの再作成ごとに呼び出されるので、呼び出されるたびに乱数が1つだけ生成されることに注意してください。 – Jaeger

+0

ここでは、すべての数値シーケンスを一度に生成し、次に選択するだけで、いつでもシーケンス「 – Selvin

答えて

6

あなたがランダムにすでに保存されている同じ番号が起こる場合は、この行は再帰さ:すでに1-15を保存している、とあなたの最高は15で、これはスタックを保証する場合

if(DoesSavedNumberExist(Random)){ 
    return ReturnUniqueSavedNumber(mMAX); 
} 

を-overflowはif文を決して満たしません。これは一般的に「乱数はいいえ、もう一度やり直してください」という悪いアプローチです。なぜなら、より多くの数を追加するにつれて、より多くの再帰を追加するからです。より良い方法は、乱数を、選択可能な数値にインデックスとして使用させることです。

+0

私はそれについて考えました。可能な左の数字を取るためには、スイッチファンクションと一緒に "return 5"を入れるなど、ランダムに生成するのは難しいでしょう。 – Jaeger

+0

残りの数字の配列を考えて、0と配列の長さの間の数字をランダムに配列して、その値を配列から返します –

+0

このようなことをするには、まず新しいInt Listを作成し、この例のようなものを見つけてください:http://stackoverflow.com/questions/13286008/find-out-the-elements-of-an-arraylist-which-is-not-present-in-another -arraylist、それをランダム化するが、質問は、intの配列を作成するには、私はループする必要があります、そのループはまた悪い練習になりますか? – Jaeger

0

同じ問題が発生しました。スタックサイズ8MB。私がアイテムを追加した時、apiは同じエラーを受けました。私はそれが編集テキストから価値を得る時に起こっていると思った。私はこれを使用して

inIT() 
sys = input_Systolic.getText().toString(); 
       dys = input_Diastolic.getText().toString(); 
       _date = dateView.getText().toString(); 
       tim = time.getText().toString(); 

レトロフィットコール

HashMap<String, Object> pMap = new HashMap<>(); 
     pMap.put("user_id",loginStatusModal.getUser_id()); 
     pMap.put("relative_id",rel_id); 
     pMap.put("systolic",sys); 
     pMap.put("diastolic",dys); 
     pMap.put("report_date",_date); 
     pMap.put("report_time",tim); 

を私の方法を変更し、サービスコールの前に私のinIT();の値を取得するように、私は私のスタックサイズ8メガバイトのエラーを解決します。

関連する問題