2009-12-10 9 views
0

J'essaie de résoudre la conjecture de collatz.Puis-je commencer un fil dans une capture en JAVA

J'utilise HashMap et Vector classes. Je dois itérer la boucle 2 147 483 648 fois, mais après que je stocke 8,438,409 valeurs dans HashMap je reçois un .

Je suis en cours d'exécution du programme dans Eclipse et ont mis l'option -Xmx1024m, mais il n'a pas aidé. Donc, j'attrape l'erreur ci-dessus et essaye de démarrer un thread qui amènerait le contrôle à une classe différente et commencerait à s'exécuter.

Toutefois, le thread ne démarre pas. J'ai mis System.out.println("We are here"); déclaration dedans et il n'est jamais imprimé à la console. Quelqu'un peut il m'aider avec ça?

Merci drôle

+0

est une erreur OutOfMemory * * pas d'exception, exception est une aberration au comportement attendu qui peut être récupérée à partir de. – pmu

Répondre

4

Oui, vous pouvez commencer un fil dans un bloc catch.

Cependant, vous ne serez probablement pas en mesure de commencer un fil si vous obtenez un OutOfMemoryError. OutOfMemoryError signifie que vous êtes à court d'espace de tas, et que tous les threads utilisent le même espace de tas (et en fait, créer un nouveau thread utilisera une partie de votre tas déjà réduit).

8

Vous avez trébuché sur la différence entre une exception et une erreur dans Java. Les deux erreurs et exceptions descendent de throwable mais juste attraper une exception n'attrapera pas une erreur. Cependant, les erreurs sont généralement assez graves et sont difficiles, voire impossibles à récupérer à partir de voir. When to catch java.lang.Error?

12

Vous ne souhaitez pas démarrer un thread dans votre bloc catch {}. C'est essayer (et échouer) de traiter les symptômes tout en ignorant la cause entièrement.

Ce que vous voulez faire est d'arrêter cette erreur OutOfMemory de se produire. Vos options sont d'augmenter la taille du segment ou d'en utiliser moins.

+0

Je dois dire, bien dit. –

-1

Oui,

il n'y a aucune restriction à partir d'un fil dans un bloc catch. Cependant, le comportement nominal lors de la capture d'une exception est le montrer aux utilisateurs, la journalisation, jeter une autre exception à la place, fermez votre application. Comme dit pour les autres, dans votre cas, vous essayez d'attraper une erreur java.lang.Error, qui n'est pas une exception, et vous n'avez pas la garantie de la prochaine ligne d'exécution de code.

+0

Catch-log-throw n'est pas vraiment une bonne idée. Vous finirez par consigner la même exception encore et encore. – atamanroman

1

Vous ne devriez pas avoir à parcourir toutes les valeurs pour résoudre une question basée sur la conjecture de collatz. Je suppose que vous essayez de calculer chaque valeur. C'est une approche que j'ai essayé mais couru dans la même chose (bien que j'utilisais .net).

Plutôt que d'essayer de résoudre le problème technique, je vous suggère de modifier votre approche.

note: J'ai réalisé, j'ai supposé (sans cause), que vous essayez de résoudre une question ProjectEuler.net (ou l'identique). Si ce n'est pas le cas, ma solution peut ne pas être viable.