Domanda

Quindi in pratica ho un progetto Gridworld che sto facendo in questo momento nella mia classe AP Comp Sci. Sto facendo Pacman. Ecco il mio codice per il metodo ACT (per coloro che non hanno familiarità con Gridworld, il metodo ACT viene chiamato ogni volta che un attore dovrebbe fare una nuova mossa):

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";
        }
    }
}

Il motivo della strana formulazione negli ultimi due se le dichiarazioni sono BC, voglio che il Pacman sia in grado di teletrasportarsi nel gioco reale. Ora, quando gestisco il gioco, circa il 90% delle volte funziona, ma nell'altro 10% ricevo un illegalArgumentException bc, dice che sto cercando di trasferirmi in un posto che non è sul tabellone (ad es. (9, -1 ) e (9,21)). Voglio sapere come posso catturare o lanciare o qualunque cosa devo fare per impedire che ciò accada. Non ho mai usato catch o lancio, quindi per favore prova a spiegare il tuo ragionamento grazie!

È stato utile?

Soluzione

Per lanciare un'eccezione, usi la parola chiave throw. Per catturare, usi il costrutto Try / Catch. Guarda questo per maggiori dettagli:

Per il tuo caso, faresti qualcosa del genere: questo è un caso di prova:

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

Dovresti, tuttavia, esaminare il tuo codice per capire perché illegalArgumentException viene comunque lanciato e correggi quella parte. Usare eccezioni e provare / cattura è per inaspettato Eventi, non eventi che ti aspetti che accada e che puoi gestire in modo migliore.

Per esempio, FileNotFoundException Viene lanciato quando non è stato possibile trovare un file. In genere lo provi / lo prendi, in modo da fare qualcosa se il file non è stato trovato. Tuttavia, se è previsto in un numero ragionevole di casi che il file potrebbe non essere lì, sarebbe meglio controllare prima se il file esiste e quindi se fa effettivamente qualcosa con esso.

Altri suggerimenti

Puoi catturare illegalArgumentException nello stesso modo in cui catturi una normale eccezione. In genere una IAE proviene da uno stato che invalida il tuo programma, quindi se ricevi un indice negativo dovrai convertirlo al suo valore valido equivalente. In termini di come il programma è destinato a funzionare, in genere un riferimento a indice negativo non è una buona cosa.

Sembra che tu voglia essere in grado di catturare le tue eccezioni per far funzionare il gioco e sei contento di parametri che si sbagliano. Quindi effettivamente stai usando eccezioni nella logica del programma, sconfiggendo il loro scopo.

Un'eccezione illegalergument è un'eccezione di runtime, non dovresti catturarli e il programma dovrebbe fallire in qualche modo. Assicurati semplicemente che i parametri passati siano corretti.

Puoi imparare a catturare e lanciare facilmente eccezioni con uno dei tanti tutorial trovati su Google.

Tuttavia, e illegalArgumentException significa che alcuni parametri che stai inviando a un'API di terze parti sono sbagliati. Dovresti eseguire il debug della tua applicazione e vedere quale codice sta causando i problemi, controlla la documentazione API per vedere i requisiti/vincoli dei parametri che stai rompendo e risolverla.

Naturalmente, puoi solo aggiungere una cattura (illegalArgunentException e) e non fare nulla al riguardo. Il tuo programma potrebbe essere eseguito, ma forse può schiantarsi più tardi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top