Erro código em API

2 respostas
E

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?

2 Respostas

MauNunes

edboy,
Pela descrição do erro, você esta tentando acessar um index do array que não existe. Por exemplo:
Você declara o array String[] x = new String[1] e tenta acessar a posição 2 assim, x[2] = “XXX”;
Da uma debugada no seu código.

E

Obrigado pela dica, mas mesmo assim não consigo. Eu acho que declarei tudo! :frowning:

Tá debugando mas tá demorando, é normal?

Edit: já debugou e só fez isto:
Listening on javadebug
User program running
User program finished

Criado 19 de janeiro de 2013
Ultima resposta 19 de jan. de 2013
Respostas 2
Participantes 2