Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Edgar_C

Erro em java - ArrayIndexOutOfBoundsException

Recommended Posts

Edgar_C

Tenho este código

package pt.ulht.fp.curiosity.core;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

import pt.ulht.fp.curiosity.RobotController;
import pt.ulht.fp.curiosity.Simulator;
import pt.ulht.fp.curiosity.Simulator.Map;
import pt.ulht.fp.curiosity.Simulator.Speed;

public class Curiosity {

   static int linhaactual, colunaactual, totallinhas, totalcolunas, orientacaoActual;

   public enum Objectos {

Espaço, desconhecido, parede, estacaoenergia
   }
   static Objectos[][] mapa;

   public enum direccao {

NORTE, SUL, ESTE, OESTE
   }
   static direccao direccaodorobot;

   public static String EnumemString(Object mapa) {

if (mapa == Objectos.estacaoenergia) {
    return "!";
} else if (mapa == Objectos.Espaço) {
    return " ";
} else if (mapa == Objectos.parede) {
    return "X";
} else {
    return "?";
}
   }

   public static void ESTADO() throws IOException {

transmitState("teste.txt");

   }

   private static int Saberlinhafrente() {
if (direccaodorobot == direccao.NORTE) {
    return (linhaactual - 1);
} else if (direccaodorobot == direccao.SUL) {
    return (linhaactual + 1);
}
return linhaactual;
   }

   private static int Sabercolunafrente() {
if (direccaodorobot == direccao.OESTE) {
    return (colunaactual - 1);
} else if (direccaodorobot == direccao.ESTE) {
    return (colunaactual + 1);
}
return colunaactual;
   }

   public static void escolherdireccao(boolean lado) {
if (direccaodorobot == direccao.NORTE) {
    direccaodorobot = direccao.ESTE;
} else {
    direccaodorobot = direccao.OESTE;
}
if (direccaodorobot == direccao.SUL) {
    direccaodorobot = direccao.OESTE;
} else {
    direccaodorobot = direccao.ESTE;
}
if (direccaodorobot == direccao.ESTE) {
    direccaodorobot = direccao.SUL;
} else {
    direccaodorobot = direccao.NORTE;

}
if (direccaodorobot == direccao.OESTE) {
    direccaodorobot = direccao.SUL;
} else {
    direccaodorobot = direccao.NORTE;
}

   }

   public static void viraesquerda() {
RobotController.turnLeft();
escolherdireccao(false);
   }

   public static void viradireita() {
RobotController.turnRight();
escolherdireccao(true);
   }

   public static void actualizacaoposicao() {
switch (direccaodorobot) {
    case OESTE:
	colunaactual = colunaactual - 1;
	break;

    case ESTE:
	colunaactual = colunaactual + 1;
	break;
    case NORTE:
	linhaactual = linhaactual - 1;
	break;
    case SUL:
	linhaactual = linhaactual + 1;
	break;

}

   }

   public static Objectos[][] mapas(int line, int column, int numLines, int numColumns) {
Objectos[][] mapaInicial = new Objectos[numLines][numColumns];
int i, y;
for (i = 0; i < mapaInicial.length; i++) {
    for (y = 0; y < mapaInicial[i].length; y++) {
	mapaInicial[i][y] = Objectos.desconhecido;
    }
}
line = linhaactual;
column = colunaactual;
mapaInicial[line][column] = Objectos.Espaço;
return mapaInicial;

   }

   public static boolean sentirparede(int linhadafrente, int colunadafrente) {
if (RobotController.senseSpace()) {
    mapa[linhaactual][colunaactual] = Objectos.Espaço;
    return true;
} else if (RobotController.senseWall()) {
    mapa[linhadafrente][colunadafrente] = Objectos.parede;
    mapa[linhaactual][colunaactual] = Objectos.Espaço;
    return false;
} else {
    mapa[linhadafrente][colunadafrente] = Objectos.estacaoenergia;
    mapa[linhaactual][colunaactual] = Objectos.Espaço;
    return false;
}

   }

   public static boolean sentirespaco() {
int linhadafrente = Saberlinhafrente();
int colunadafrente = Sabercolunafrente();
switch (mapa[linhadafrente][colunadafrente]) {
    case desconhecido:
	return sentirparede(linhadafrente, colunadafrente);
    case Espaço:
	return true;
    case parede:
	return false;
    case estacaoenergia:
	return false;
    default:
	return false;
}


   }

   public static void configLandingSite(int line, int column, int numLines,
    int numColumns) {
//Inicializa estado do robot
direccaodorobot = direccao.NORTE;
mapa = mapas(line, column, numLines, numColumns);






   }

   public static void controlRobot() throws IOException {
int energia = RobotController.getEnergy();
System.out.println("energia");
if (RobotController.senseEnergy() == true) {
    RobotController.recharge();

} else if (RobotController.senseEnergy() == false) {
    actualizacaoposicao();
    viraesquerda();
}

if (sentirespaco()) {
    if (RobotController.getEnergy() < 3) {
	ESTADO();
    } else {

	RobotController.move();
	actualizacaoposicao();
    }
} else {
    Random rnd = new Random();
    int n = rnd.nextInt(3);
    if (n == 0) {
	viraesquerda();
//estadoRobot();

    } else if (n == 1) {
	viradireita();
//estadoRobot();
    }

}
   }

   public static void transmitState(String filename) throws IOException {
//Escrever estado para ficheiro filename passado como argumento
BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
for (int x = 0; x < mapa.length; x++) {
    for (int y = 0; y < mapa[x].length; y++) {
	bw.write(EnumemString(mapa[x][y]));
    }
    bw.write(System.getProperty("line.separator"));
}

System.out.println("Imprimiu");
bw.flush();
bw.close();
   }

   public static void main(String[] args) {
//Experimentar Map.WORLD01 Map.WORLD02 Map.WORLD03 Map.WORLD04 Map.WORLD05
//e as velocidades Speed.SLOW Speed.NORMAL Speed.FAST
Simulator.run(Map.WORLD05, Speed.FAST);
   }
}

E está-me a dar o seguinte erro:

java.lang.ArrayIndexOutOfBoundsException: -2
ERROR: Could not initiate simulator
at pt.ulht.fp.curiosity.core.Curiosity.sentirespaco(Curiosity.java:129)
at pt.ulht.fp.curiosity.core.Curiosity.controlRobot(Curiosity.java:160)
at pt.ulht.fp.curiosity.Simulator.run(Simulator.java:55)
at pt.ulht.fp.curiosity.core.Curiosity.main(Curiosity.java:201)

E não consigo resolve-lo, alguém me ajuda?

Share this post


Link to post
Share on other sites
brunoais

  1. Corrige a indentação
  2. Corrige o título. Sê mais específico em relação ao problema que tens. Neste caso é um ArrayIndexOutOfBoundsException, ter isso em conta é um bom sítio para onde começar.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.