2011-08-30 1 views
0
public class StackTest { 
    public static void main(String[] args) { 
     show(); 
     System.out.print("welcome back to maain"); 
     display(); 
    } 
    static void show(){ 
     try{ 
      show(); //recursion 
     }catch(StackOverflowError e){ 
      System.out.print("error cought"); 
     } 
    } 
    static void display(){ 
     System.out.print("after stack overflow error"); 
    } 
} 

Dans ce programme, une erreur StackOverflowError se produit mais est gérée et le programme ne se termine pas anormalement. Pourquoi? Vous pouvez le voir à http://ideone.com/vwSavUne erreur peut-elle être gérée?

+1

liés: http://stackoverflow.com/questions/ 2535723/try-catch-on-stack-overflows-in-java – Thilo

Répondre

5

Vous pouvez poignée Error s parce qu'ils sont Throwable tout comme Exception s. Les erreurs sont destinées à indiquer des problèmes indépendants de la volonté de votre programme, tels que OutOfMemoryError et StackOverflowError, mais vous pouvez également définir vos propres erreurs. Vous pensez peut-être que OutOFMemoryError peut être intercepté, mais rien ne garantit que vous disposerez de suffisamment d'espace pour exécuter le gestionnaire. Les erreurs ne doivent donc généralement pas être détectées. Dans votre cas, cependant, vous vous en êtes sorti avec. Aucune règle de langue n'a été violée lors de la capture et du traitement de cette erreur. La vraie question est, devrait vous les attraper? Normalement, lorsqu'une erreur, par opposition à une exception, est levée, votre application est très probablement dans un état incohérent, faisant de la récupération un Crapshoot, au mieux. Alors soyez vraiment, vraiment prudent. Mieux vaut l'oublier et laisser l'application mourir, car tout ce qui court après le gestionnaire n'est pas garanti pour être quelque chose que vous voulez exécuter.

+0

afin que vous confirmiez qu'un 'Error' pourrait être attrapé? –

+0

@Mohammad Faisal - c'est ce qu'il a dit. Et c'est ce que fait votre code. Les erreurs peuvent être attrapées ... mais c'est généralement une mauvaise idée de le faire. (Comme le fait de tirer une arme sur votre pied est généralement une mauvaise idée.) –

+0

@Mohammad, oui en effet 'Error' objets peuvent être capturés. Si vous voulez une confirmation, voir [la section sur les instructions try à la spécification de langage Java] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.20).Il indique à ce lien que la clause catch prend des paramètres dont les types déclarés sont 'Throwable' ou toute sous-classe de' Throwable'. Notez que 'Error' est une sous-classe de' Throwable'. Donc encore une fois, possible mais pas conseillé. –

2

Pourquoi vous attendez-vous à ce qu'il se termine lorsque vous attrapez l'exception (ou plutôt l'erreur dans ce cas)? Quoi d'autre ce bloc catch ferait-il?

Vous pouvez intercepter et gérer à peu près toutes les conditions d'erreur, bien que vous ne devriez généralement attraper que des exceptions.

+0

Je demande cela parce que j'ai entendu dire que les erreurs ne peuvent pas être saisies/traitées –

+0

Pour cela, voir la réponse de @ Ray. – Thilo

0

Il ne sera terminé de façon anormale que si votre exception est propagée jusqu'à votre méthode principale et que vous ne la gérez pas. Se produit généralement pour les exceptions d'exécution non contrôlées. Si vous voulez mettre fin à votre programme et arrêter la VM, vous pouvez appeler System.exit (int errorCode) dans le bloc catch, il y aura des programmeurs qui se plaindront toujours ici si c'est fait mais c'est un moyen de le faire.

0

généralement vous ne surprenez Error, sauf pour LinkageErrors, pas def classe a trouvé des erreurs, des erreurs de liaison non satisfaite, les erreurs de changement de classe incompatibles ..

aussi une erreur OutOfMemory (parfois l'exception StackOverflow) doesnot permettent de contrôler la attraper le bloc car il n'y a pas de mémoire.

1

Vous pouvez attraper tout Throwable et c'est au développeur de le gérer correctement. Vous pouvez même gérer ThreadDeath (déclenchée par un Thread.stop()) ou d'une autre sous-classe de Throwable (qui est ni une erreur ou une exception)

public class MyThrowable extends Throwable { } // checked "exception" 

try { 
    throw new MyThrowable(); 
} catch (Throwable t) { 
    t.printStackTrace(); 
    Thread.currentThread().stop(t); // rethrow blindly. 
} 
+0

Y a-t-il des exemples de Throwables qui ne sont ni une erreur ni une exception? – Thilo

+0

J'ai ajouté un exemple. À mon humble avis, ce n'est pas une bonne pratique de programmation parce que son obscur et la plupart des gens ne sauront pas pourquoi vous n'utilisez pas une exception ou une erreur. ;) –

+1

Je pensais "des exemples dans la nature". Probablement pas, parce que ce serait mal vu. – Thilo

Questions connexes