@xaiponews

Android Studio что не так с кодом?

Android Studio что не так с кодом? Пытаюсь вывести результат Randoma с вероятностью. Код запускается. Нажимаю кнопку - приложение вылетает с ошибкой. (Это макет кода, потом будет вставлен в основное приложение).

package com.example.myapplication;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.io.Serializable;
import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button cmak = (Button)findViewById(R.id.knopka);
        final TextView ocko = (TextView)findViewById(R.id.okno);

        cmak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ocko.setText(String.valueOf(foo()));
                ArrayList<Integer> gold = (ArrayList<Integer>) foo();
                Log.i("Gold", "" + gold.get(0) + "," +
                        gold.get(1) + "," +
                        gold.get(2) + "," +
                        gold.get(3) + "," +
                        gold.get(4));
            }

            private Serializable foo(){
                ArrayList<Integer> foo = new ArrayList<>();

                for (int i = 0; i< 5; i++) {
                    double random = Math.floor(Math.random() * 100) + 1;
                    if (random < 36) {
                        return 1;
                    } else if (random < 61) {
                        return 2;
                    } else if (random < 81) {
                        return 3;
                    } else if (random < 96) {
                        return 4;
                    } else if (random < 98) {
                        return 5;
                    }
                }
                return foo;
            }
        });
    }
}
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@anegin
Android dev
Нарушена логика в коде.

Метод foo() почему-то возвращает:
- или число от 1 до 5, если на любом шаге цикла в random мы получили число меньше 98.
- или пустой список foo (в случае если random 5 раз оказалось число выше 98).

Далее в методе onClick() после вызова foo() происходит кастинг к ArrayList.
Тут приложение и падает (вероятно с ClassCastException), если foo вернула число, а не ArrayList.
В случае если foo() все таки вернет ArrayList, то приложение все равно упадет при вызове gold.get(0) с ошибкой IndexOotOfBoundException, т.к. список пустой.

Если я правильно понимаю то, что хотел сделать автор, то нужно в методе foo() все эти return 1, return 2 и т.д. заменить на добавление числа в список.

if (random < 36) {
foo.add(1);
} else if (random < 61) {
foo.add(2);
} ... и т.д.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@xaiponews Автор вопроса
Может кому- то пригодится решение. Android Studio Random с вероятностью. Сам долго искал, внятного образца не было.
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.Serializable;
import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button cmak = (Button)findViewById(R.id.knopka);
        final TextView ocko = (TextView)findViewById(R.id.okno);

        cmak.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ocko.setText(String.valueOf(foo()));
            }

            private Serializable foo(){
                ArrayList<Integer> foo = new ArrayList<>();

                for (int i = 0; i< 5; i++) {
                    double random = Math.floor(Math.random() * 100) + 1;
                    if (random < 36) {
                        foo.add(1);
                    } else if (random < 61) {
                        foo.add(2);
                    } else if (random < 81) {
                        foo.add(3);
                    } else if (random < 96) {
                        foo.add(4);
                    } else if (random < 98) {
                        foo.add(5);
                    }
                }
                return foo;
            }
        });
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Drum Pads 24 Ульяновск
от 90 000 до 160 000 ₽
FYM.TEAM Новосибирск
от 100 000 до 120 000 ₽
Mountain Ridge Москва
от 150 000 до 200 000 ₽