Pregunta

Básicamente, tengo un proyecto GridWorld que estoy haciendo ahora mismo en mi clase AP Comp Sci.Estoy haciendo Pacman.Aquí está mi código para el método act (para aquellos que no están familiarizados con GridWorld, el método act se llama cada vez que se espera que un actor haga un nuevo movimiento):

public void act()
{
    Location loc = getLocation();

    if(direction==null) {
    }

    else if(direction.equals("NORTH")) {
        Location next = loc.getAdjacentLocation(loc.NORTH);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(next);
            direction = "NORTH";
        }
    }

    else if(direction.equals("SOUTH")) {
        Location next = loc.getAdjacentLocation(loc.SOUTH);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(getLocation().getAdjacentLocation(getLocation().SOUTH));
            direction = "SOUTH";
        }
    }

    else if(direction.equals("EAST")) {
        Location next = loc.getAdjacentLocation(loc.EAST);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(getLocation().getAdjacentLocation(getLocation().EAST));
            direction = "EAST";
        }

        else if(getLocation().getCol()==20 && getLocation().getRow()==9) {
            moveTo(new Location(9,0));
            direction = "EAST";
        }
    }

    else if(direction.equals("WEST")) {
        Location next = loc.getAdjacentLocation(loc.WEST);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            moveTo(getLocation().getAdjacentLocation(getLocation().WEST));
            direction = "WEST";
        }

        else if(getLocation().getCol()==0 && getLocation().getRow()==9) {
            moveTo(new Location(9,20));
            direction = "WEST";
        }
    }
}

La razón de la redacción extraña en las dos últimas declaraciones if es porque quiero que Pacman pueda teletransportarse en el juego real.Ahora, cuando ejecuto el juego, aproximadamente el 90% de las veces funciona, pero en el otro 10% obtengo una IllegalArgumentException porque dice que estoy intentando moverme a un lugar que no está en el tablero (por ejemplo,(9,-1) y (9,21)).Quiero saber cómo puedo atrapar o lanzar o lo que sea que deba hacer para evitar que esto suceda.Nunca he usado atrapar o lanzar, así que intenta explicar tu razonamiento, ¡gracias!

¿Fue útil?

Solución

Para lanzar una excepción, usa la palabra clave throw. Para atrapar, usa la construcción Try / Catch. Vea esto para más detalles:

Para su caso, haría algo como esto: este es un caso de prueba:

try {
    throw new IllegalArgumentException("Threw an IllegalArgumentException");
} catch(IllegalArgumentException e) {
    System.out.println("Caught an IllegalArgumentException..." + e.getMessage());
}

Sin embargo, debe buscar su código para ver por qué se está lanzando ilegalargumentException de todos modos y arreglar esa parte. Usar excepciones e intentar / captar es para inesperado Eventos, no eventos que espera que suceda y que puedas manejar de una mejor manera.

Por ejemplo, FileNotFoundException se arroja cuando no se pudo encontrar un archivo. En general, lo intenta / lo atrapa, para que haga algo si no se encontró el archivo. Sin embargo, si se espera en un número razonable de casos que el archivo podría no estar allí, sería mejor verificar primero si el archivo existe y luego si realmente hace algo con él.

Otros consejos

Puede atrapar ilegalargumentException de la misma manera que obtiene una excepción normal. Por lo general, un IAE proviene de un estado que invalida su programa, por lo que si recibe un índice negativo, deberá convertirlo en su valor válido equivalente. En términos de cómo su programa está destinado a funcionar, generalmente una referencia de índice negativa no es algo bueno.

Parece que quieres poder detectar tus excepciones para mantener el juego en funcionamiento y estás contento con que los parámetros sean incorrectos.De manera efectiva, estás utilizando excepciones en la lógica del programa, frustrando su propósito.

Una IllegalArgumentException es una excepción en tiempo de ejecución, no debería detectarla y el programa simplemente debería fallar de alguna manera.Simplemente asegúrese de que los parámetros pasados ​​sean correctos.

Puede aprender a atrapar y lanzar excepciones fácilmente con uno de los muchos tutoriales que se encuentran en Google.

Sin embargo, y ilegalargumentException significa que algún parámetro que está enviando a una API de terceros es incorrecto. Debe depurar su aplicación y ver qué código está causando el problema, verifique la documentación de la API para ver los requisitos/restricciones de los parámetros que está rompiendo y solucionándolo.

Por supuesto, solo puede agregar una captura (ilegalarguntexception e) y no hacer nada al respecto. Su programa puede ejecutarse, pero tal vez pueda bloquearse más tarde.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top