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.