2009-05-08 23 views
8

Dove vengono memorizzate le eccezioni? Stack, Heap. Come viene allocata e allocata la memoria per le eccezioni? Ora se avete più di un'eccezione che deve essere gestita ci sono oggetti di tutte queste eccezioni create?Eccezioni Java Eccezioni C++

+0

Inoltre vorrei sapere se le eccezioni in C++ e Java sono gestite allo stesso modo o sono necessarie ulteriori misure? – Thunderboltz

+1

Sembra che gli utenti ti rispondano senza menzionare se si riferiscono a Java o C++. D'altra parte, su quale dei due chiedi? –

+1

Prima mi ha chiesto solo di Java, il C++ è venuto dopo ... – Thilo

risposta

7

Suppongo che la memoria per le eccezioni sia allocata nello stesso modo di tutti gli altri oggetti (nello heap).

Questo era un problema, perché non è possibile allocare memoria per un OutOfMemoryError, che è il motivo per cui c'era no stack trace until Java 1.6. Ora pre-allocano spazio per lo stacktrace.

Se vi state chiedendo dove è memorizzato il riferimento all'eccezione mentre viene gettato, la JVM mantiene internamente il riferimento mentre si svolge lo stack di chiamate per trovare il gestore di eccezioni, che poi si fa il riferimento (sul suo stack frame, proprio come qualsiasi altra variabile locale).

Non possono essere lanciate due eccezioni contemporaneamente (sullo stesso thread). Possono essere nidificati, ma in questo caso si ha una sola eccezione "attiva" con un riferimento all'eccezione nidificata.

Quando tutti i riferimenti all'eccezione scompaiono (ad esempio dopo che il gestore di eccezioni è terminato), l'eccezione viene raccolta tramite garbage collection come qualsiasi altra cosa.

+0

se dovessi localizzarlo nel segmento di stack o nel segmento di dati, dove lo troveresti ?? – Thunderboltz

+0

Cosa significa C++? – tuergeist

+0

Non so nulla di C++. Ha prima chiesto solo su Java, il C++ è venuto dopo .. – Thilo

1

Le eccezioni in Java sono oggetti e, come tali, vengono memorizzati nell'heap.

Quando viene generata un'eccezione, la JVM cerca un gestore di eccezioni corrispondente nel codice. Questo si applica anche quando ci sono più eccezioni che qualcosa potrebbe generare.

1

Dove vengono memorizzate le eccezioni? Stack, Heap. Come viene allocata la memoria e deallocated per le eccezioni?

Le eccezioni sono oggetti come gli altri in questo senso. Assegnato sullo heap tramite new, deallocato dal garbage collector.

Ora, se si dispone di più di un un'eccezione che deve essere maneggiato sono lì oggetti di tutti questi eccezioni create?

Non so cosa intendi con questo. Vengono creati tramite new, uno alla volta. Ce ne possono essere più di una in giro quando usi il concatenamento delle eccezioni - e in realtà non c'è nulla che ti impedisca di creare migliaia di eccezioni e metterle in una Lista da qualche parte - semplicemente non ha molto senso.

2

Per le informazioni più complete sulle eccezioni, possiamo andare direttamente alla fonte: Chapter 11: Exceptions di The Java Language Specification, Second Edition.

Le eccezioni sono effettivamente oggetti.Essi sono una sottoclasse di Throwable:

Ogni eccezione è rappresentata da un un'istanza della classe Throwable o uno delle sue sottoclassi; tale oggetto può essere utilizzato per trasportare dal punto in cui si verifica un'eccezione a il gestore che lo cattura.

Pertanto, sarebbe probabilmente sicuro assumere che, come con qualsiasi altro Object in Java, verrà allocato sull'heap.

In termini di presenza di più oggetti Exception, probabilmente non sarebbe il caso, poiché una volta si verifica un'eccezione, Java Virtual Machine inizierà a trovare un gestore di eccezioni.

Durante il processo di un'eccezione , la macchina virtuale Java completa bruscamente, una per una, qualsiasi espressioni, istruzioni, metodo e costruttore invocazioni, inizializzatori, e campo espressioni inizializzazione che hanno cominciato ma non completata l'esecuzione nel thread corrente. Questo processo continua fino a quando un gestore è trovato che indica che gestisce quel particolare eccezione nominando la classe di eccezione o di un superclasse della classe dell'eccezione .

Per ulteriori informazioni sul modo in cui le eccezioni devono essere gestite in fase di esecuzione, Section 11.3 Handling of an Exception ha i dettagli.

4

Per C++ non è definito dove memorizzare le eccezioni, ma la maggior parte dei compilatori utilizza uno stack speciale. Per Java, come qualcuno ha scritto prima, sono archiviati nell'heap.

Come eccezioni sono oggetti in C++ così come in Java, sono allocati e deallocati come oggetti nella lingua specifica.

C'è sempre solo un'eccezione attiva per thread in entrambe le lingue.

+0

quindi, se vuoi dire, se faccio una "nuova eccezione", allora viene memorizzata nello "stack speciale". Ora, come fa il nuovo operatore a distinguere tra quale pila usare quando? Gestisce casi speciali? – Thunderboltz

+0

La domanda è, in che modo il compilatore valuta un oggetto come eccezione e fornisce un codice macchina appropriato. Quello che voglio dire è che il nuovo operatore non deve distinguere ... – tuergeist

+0

A proposito, non perdere la nota: "Per C++ non è definito dove archiviare le eccezioni"! – tuergeist

1

In Java, Exception estende Throwable che estende Object. cioè, da un punto di vista della memoria, è un oggetto come qualsiasi altro.

È stato suggerito in Java 7 che le variabili locali possono essere inserite nello stack utilizzando l'analisi di escape per trovare i candidati per le variabili di stack. Tuttavia, le eccezioni vengono solitamente generate da un metodo a un chiamante (o al suo chiamante, ecc.), Quindi non sarebbe molto utile posizionare l'eccezione sullo stack.