2012-02-20 4 views
4

Donc, fondamentalement, j'ai un projet GridWorld que je fais en ce moment dans ma classe AP Comp Sci. Je fais Pacman. Voici mon code pour la méthode d'acte (pour ceux qui ne connaissent GridWorld, la méthode de loi est appelé à chaque fois qu'un acteur devrait faire un nouveau mouvement):Comment lancer et attraper une exception IllegalArgumentException?

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 raison du libellé bizarre dans les deux dernières Si les déclarations sont bc, je veux que le Pacman puisse se téléporter dans le vrai jeu. Maintenant, quand je lance le jeu, environ 90% du temps cela fonctionne, mais dans les 10% restants, je reçois un IllegalArgumentException bc, il dit que j'essaie de passer à un endroit qui n'est pas sur le plateau (par exemple.) et (9,21)). Je veux savoir comment je peux attraper ou jeter ou tout ce que je dois faire pour empêcher cela de se produire. Je n'ai jamais utilisé catch ou throw donc aussi s'il vous plaît essayez d'expliquer votre raisonnement merci!

Répondre

5

Pour lever une exception, utilisez le mot clé throw. Pour attraper, vous utilisez la construction try/catch. Voir ce pour plus de détails:

Pour votre cas, vous feriez quelque chose comme ça - c'est un test:

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

Vous devez cependant regarder dans votre code pour voir pourquoi IllegalArgumentException est levé de toute façon et réparer cette partie. Utiliser des exceptions et essayer/attraper est pour événements inattendus, pas les événements que vous attendez et que vous pouvez gérer de manière plus efficace.

Par exemple, FileNotFoundException est renvoyé lorsqu'un fichier est introuvable. Vous essayez généralement/attraper cela, de sorte que vous faites quelque chose si le fichier n'a pas été trouvé. Cependant, s'il est prévu dans un nombre raisonnable de cas que le fichier ne soit pas présent, il est préférable de vérifier d'abord si le fichier existe et s'il en fait réellement quelque chose.

+1

Merci!J'ai donc suivi votre conseil et même si cela a pris du temps, j'ai finalement trouvé où je me trompais et j'ai fini par régler ça. –

+0

Cool, fini avec la meilleure solution, heureux que vous l'ayez résolu! –

0

Vous pouvez capturer IllegalArgumentException de la même manière que vous attrapez une exception normale. Généralement, un IAE provient d'un état qui invalide votre programme, donc si vous recevez un index négatif, vous devrez le convertir en sa valeur valide équivalente. En termes de fonctionnement de votre programme, une référence d'index négative n'est généralement pas une bonne chose.

0

Il semble que vous vouliez être en mesure d'attraper vos exceptions pour que votre jeu continue à fonctionner, et vous vous contentez de paramètres incorrects. Tellement efficacement vous employez des exceptions dans la logique du programme, en battant leur but.

Une exception IllegalArgumentException est une exception d'exécution, vous ne devriez pas les attraper et le programme devrait échouer d'une manière ou d'une autre. Assurez-vous simplement que les paramètres transmis sont corrects.

0

Vous pouvez apprendre à intercepter et à supprimer facilement des exceptions grâce à l'un des nombreux didacticiels disponibles sur Google. Cependant, et IllegalArgumentException signifie que certains paramètres que vous envoyez à une API tierce sont incorrects. Vous devez déboguer votre application et voir quel code cause le problème, consultez la documentation de l'API pour voir les exigences/contraintes des paramètres que vous cassez et corrigez-la.

Bien sûr, vous pouvez seulement ajouter un catch (IllegalArgunentException e) et ne rien faire. Votre programme peut s'exécuter, mais peut-être qu'il peut tomber en panne plus tard.

Questions connexes