2011-05-26 3 views
0

Pensez à deux cas case1 et case2 plus deux méthodes method1 et method2. Say method1 résout case1 et method2 résout case2. Maintenant, j'ai un programme qui pourrait se retrouver avec case1 ou case2. Dans mes codes, j'appelle la méthode 1, peu importe le cas. Mais, si case2 se produit, method1 donne une exception nullpointer. Ce que je veux est ce qui suit: mes codes devraient d'abord appeler la méthode 1, si une exception se produit, alors la méthode 2 est appelée. Comment vais-je faire ça? Puisque je n'ai aucune information sur essayer et attraper, j'ai vraiment besoin d'aide!Java - Débarrassez-vous de NullPointerException

+2

Je pense qu'un code est meilleur que n'importe quelle explication. – khachik

+0

Je suppose que vous avez raison. Dites que j'ai TreeNode parentNode qui sera la main gauche d'une égalité et la main droite sera search (parent, this) ou search2 (parent, this). Pourtant, search and search2 pourrait renvoyer null, ce que je ne veux pas. Maintenant, comment dois-je mettre en œuvre? –

+0

s'il vous plaît modifier votre question et poster un échantillon de code, pas seulement les noms de variables et les signatures de méthodes. – khachik

Répondre

2

Attraper NullPointerException est une mauvaise pratique - vous ne pouvez pas attraper l'exception particulière que vous voulez attraper. Vous avez deux options:

1) throw votre propre exception et l'attraper plus tard:

public void method1(Case caze) throws MyException { 
    if (case.getType() == CaseType.CaseOne) { 
     // processing 
    } else { 
     throw new MyException("Wrong case type"); 
    } 
    } 

Et le code client:

try { 
    method1(caze); 
} catch (MyException e) { 
    // log the excpetion 
    method2(caze); 
} 

2) Retourner un drapeau booléen, ce qui indique que le traitement a été finalisé avec succès. Rappelez-vous qu'il est toujours préférable d'analyser les valeurs plutôt que d'utiliser le mécanisme d'essai dans vos situations. Je suggère la variante n ° 2 pour vous.

3

Vous pouvez le faire:

try { 
     method1(); 
    } 
    catch (Exception e) { 
     method2(); 
    } 

Cela dit, il est généralement préférable de compter sur les exceptions que pour des conditions exceptionnelles. Pour un flux de contrôle normal, vous pouvez utiliser un:

if (isCase2()) { 
     method2(); 
    } 
    else { 
     method1(); 
    } 
+0

Comme @Vladimir posté, si vous voulez aller avec try/catch, il est préférable de lancer votre propre objet exception de method1 plutôt que de s'appuyer sur un NPE (qui peut survenir même dans le cas 1 en raison d'autres problèmes). –

+0

D'accord. Le premier exemple ci-dessus est destiné à satisfaire littéralement l'OP: "mes codes devraient d'abord appeler la méthode 1, si une exception se produit, alors la méthode 2 est appelée." Si vous pouvez distinguer a priori cas1 et cas2, il est préférable d'utiliser une exception. –

+0

Absolument. Utilisez des exceptions pour des situations exceptionnelles. Cela ressemble à avoir un cas par rapport à un autre n'est pas exceptionnel du tout. –