FATAL EXCEPTION: main java.lang.IndexOutOfBoundsException: 6, 1 in TextView (?)

1

I'm getting an error that I do not know where to take. The program is for fun, a simulator of pokemon battles, and I want to show in a textview the turn-based battle (turn by turn, not the whole battle at the end).

The error is:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.user.batallapokemon, PID: 30963
                  java.lang.IndexOutOfBoundsException: 6, 1
                      at android.text.PackedIntVector.getValue(PackedIntVector.java:75)
                      at android.text.DynamicLayout.getLineTop(DynamicLayout.java:701)
                      at android.text.Layout.drawText(Layout.java:408)
                      at android.widget.Editor.drawHardwareAcceleratedInner(Editor.java:1805)
                      at android.widget.Editor.drawHardwareAccelerated(Editor.java:1724)
                      at android.widget.Editor.onDraw(Editor.java:1664)
                      at android.widget.TextView.onDraw(TextView.java:6913)
                      at android.view.View.draw(View.java:19225)
                      at android.view.View.updateDisplayListIfDirty(View.java:18175)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4202)
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4182)
                      at android.view.View.updateDisplayListIfDirty(View.java:18134)
                      at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:647)
                      at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:653)
                      at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:761)
                      at android.view.ViewRootImpl.draw(ViewRootImpl.java:3021)
                      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2825)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2378)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1410)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6834)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:778)
                      at android.view.Choreographer.doFrame(Choreographer.java:713)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
                      at android.os.Handler.handleCallback(Handler.java:789)
                      at android.os.Handler.dispatchMessage(Handler.java:98)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6809)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

My code is this:     public class MainActivity extends AppCompatActivity {

String [] tuPoke = { "Dragonite", "Salamence", "Charizard", "Metagross"};
String [] pokeRival = { "Dragonite", "Salamence", "Charizard", "Metagross"};
Spinner spinnerYo;
Spinner spinnerRival;
static TextView textoBatalla;

Button boton;
static int turno = 0;
static int vida_dragonite = 150;
static int vida_salamence = 150;

static final String dragonite = "Dragonite";
static final String salamence = "Salamence";

static int[] ataquesdragonite = { 7, 10, 18, 21 };
static int[] ataquessalamence = { 6, 12, 15, 23 };

static boolean bayaAranjaDragonite = true;
static boolean bayaAranjaSalamence = true;


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


    spinnerYo = findViewById(R.id.spinnerTuPokemon);
    spinnerRival = findViewById(R.id.spinnerPokemonRival);
    spinnerYo.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tuPoke));
    spinnerRival.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, pokeRival));
    textoBatalla = findViewById(R.id.textoBatalla);
    textoBatalla.setMovementMethod(new ScrollingMovementMethod());
    boton = findViewById(R.id.button);
    textoBatalla.setMaxLines(100000);



    public void dragoniteVsSalamence() throws InterruptedException{


    textoBatalla.append("\n"+ dragonite + " vs " + salamence);
    textoBatalla.append("\nVida de ambos al comenzar= " + vida_salamence);

    textoBatalla.append("\nLa pelea comenzó!");

    while (vida_dragonite > 0 && vida_salamence > 0) {

        Thread.sleep(2400);

        if (turno % 2 == 0) {
            textoBatalla.append("\nAtaca " + dragonite);
            Thread.sleep(10);
            int ataque = (int) (Math.random() * ataquesdragonite.length);
            if (ataque == 0) {
                textoBatalla.append("\n" + dragonite + " usa Placaje");
            } else if (ataque == 1) {

                textoBatalla.append("\n" + dragonite + " usa Golpe Aéreo");

            } else if (ataque == 2) {

                textoBatalla.append("\n" + dragonite + " usa Garra Dragón");

            } else if (ataque == 3) {

                textoBatalla.append("\n" + dragonite + " usa Enfado");

            }
            textoBatalla.append("\n" + dragonite + " hace " + ataquesdragonite[ataque] + " de daño");

            vida_salamence -= ataquesdragonite[ataque];
            criticoDvsS();


            if (vida_salamence > 0) {
                textoBatalla.append("\n" + salamence + " tiene " + vida_salamence + " de vida");
            } else {
                textoBatalla.append("\n" + salamence + " se ha debilitado");
            }

        } else {
            textoBatalla.append("\n" + "Ataca Salamence");
            Thread.sleep(10);
            int ataque = (int) (Math.random() * ataquessalamence.length);

            if (ataque == 0) {
                textoBatalla.append("\n" + salamence + " usa Arañazo");
            } else if (ataque == 1) {

                textoBatalla.append("\n" + salamence + " usa Fuerza");

            } else if (ataque == 2) {

                textoBatalla.append("\n" + salamence + " usa Garra Dragón");

            } else if (ataque == 3) {

                textoBatalla.append("\n" + salamence + " usa Enfado");

            }
            textoBatalla.append("\n" + salamence + " hace " + ataquessalamence[ataque] + " de daño");

            vida_dragonite -= ataquessalamence[ataque];
            criticoDvsS();

            if (vida_dragonite > 0) {
                textoBatalla.append("\n" + dragonite + " tiene " + vida_dragonite + " de vida");
            } else {
                textoBatalla.append("\n" + dragonite + " se ha debilitado");
            }
        }

        bayaAranjaDS();
        turno++;
        Thread.sleep(200);
    }

and the button method:

   boton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textoBatalla.setText("");
            new Thread(new Runnable() {
                public void run() {

           try {

               if(spinnerYo.getSelectedItem().toString() == "Dragonite" && spinnerRival.getSelectedItem().toString() == "Salamence" ) {

                   dragoniteVsSalamence();
               }

           }catch(InterruptedException e){
               e.printStackTrace();

           }catch(Exception e1){
               e1.printStackTrace();
           }



                }

            }).start();
        }

    });

}

"textBatalla" is a textview. The problem is that the program sometimes arrives at a certain line, sometimes at another, then the outofboundsexception changes, and instead of leaving 6, 1 comes out 17, 1 for example, and it has made me a mess because it does not even tell me what class or what line has the error.
Thanks.

    
asked by hadr0n 28.03.2018 в 01:00
source

0 answers