Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Eccezioni

  1. #1

    Eccezioni

    Piccola domanda...

    void go() { // recursion gone bad
    go();
    }

    Al runtime viene provocata la seguente eccezione:

    java.lang.StackOverflowError

    Perchè? Perchè viene richiamato sempre il metodo go(), sino a quando la JVM esaurisce la memoria?

    Grazie in anticipo.

  2. #2
    Utilizzare la ricorsione comporta un uso molto elevato della memoria in quanto l'annidamento del metodo che vai a richiamare ricorsivamente se non è ben gestito può portarti a problemi di STACK OVERFLOW.

    Per esempio se tu vai ad eseguire il metodo sopra esposto, genererai una ricorsione infinita che terminerà con un errore java.lang.StackOverflowError in quanto il metodo viene richiamato all'infinito.
    Questo perchè viene a crearsi un Overflow (trabocco) nello stack di runtime.

    void go() {
    go();
    }

    Per comprendere la causa del problema che può generarsi occorre capire come viene impiegata la memoria dalla JVM.
    La memoria in Java si può pensare sostanzialmente divisa in due parti: Stack (o Pila) e Heap.

    Nello Stack la memoria viene gestita dinamicamente ed e' organizzata in segmenti che vengono allocati in corrispondenza di ogni chiamata di metodo e eliminati in corrispondenza del ritorno del metodo. Tali segmenti costituiscono la memoria locale del metodo cui sono associati.
    I dati memorizzati nello stack, cioè nella memoria locale dei metodi, sono solo dati elementari(int, char, float, etc.). Tra i valori elementari vi sono anche i puntatori(ovviamente questi non sono presenti esplicitamente come in C, tuttavia possono essere interpretati tali tutti i riferimenti ad array e oggetti, che saranno nell'Heap), che sono indirizzi, cioè in definitiva numeri che identificano un registro nella memoria.

    Nell'Heap vengono memorizzati invece gli oggetti e gli Array che non sono mai memorizzati sullo stack ma che sono accessibili mediante i puntatori che sono memorizzati nello stack.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.