Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    java.lang.StackOverflowError

    Ciao a todos,sto avendo un fastidioso problema con il suddetto errore,googlando un pò ho scoperto che accade quando ci sono dei cicli infiniti oppure delle ricorsioni "too deep",credo di essere nel secondo caso.In pratica sto utilizzando il pattern "State",entro nello stato iniziale ed ho la necessità di verificare una condizione in ogni secondo,solo se questa è verificata posso fare un transition nel successivo stato altrimenti faccio la transition nello stato in cui mi trovo per far si appunto di riverificare la condizione.E qui credo stia il problema in quanto ogni volta che eseguo la transition eseguo sempre e solo la entryAction dello stato in cui mi trovo quindi in pratica è una chiamata ricorsiva implicita che culmina con uno StackOverflowError.Naturalmente ho visto alcune soluzioni che riguardano l'aumento della size dello stack ma non credo mi interessino perchè è un errore di programmazione più che di java,il fatto è che non so come agirare il problema,ho provato con un while(true) con tanto di Thread.sleep(long ms) per verificare la condizione in ogni secondo ma facendo così si blocca il resto dell'applicazione,gira solo il while(true) in pratica se qualcuno conoscesse il pattern state e potesse darmi una dritta su come agire gliene sarei grato!

    p.s. posto un esempio di codice del problema

    codice:
    public class Application extends FSM { // finite state machine
    private boolean condition=...; // valore dato da una chiamata ad un metodo di un altra classe
    private State INITIAL_STATE = new InitialState();
    private State FOLLOW_STATE = new FollowState();
    private class InitialState extends State {
    public void entryAction() { //entryAction metodo della classe State
    if(condition)
    transition(FOLLOW_STATE); // metodo di FSM che mi fa spostare in un altro stato
    else transition(INITIAL_STATE);
    }
    } // InitialState
    
    private class FollowState extends State {
    }
    }//Application
    grazie per chi mi risponderà,ne ho davvero bisogno!

  2. #2
    nessuno ?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Dal codice che hai postato non si capisce dove possa essere il problema. Ad ogni modo, per esperienza io dubito fortemente che tu ti ritrovi nel secondo caso, quanto piuttosto nel primo.
    E' molto probabile che tu da qualche parte tenti di istanziare un oggetto all'interno del suo costruttore (magari non in modo diretto).


    Posta l'intero codice, o linkalo da qualche parte se è troppo lungo. Con quello che hai postato non si fa niente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    ok grazie,ti allego la classe incriminata secondo (JBuilder) e l'errore che ricevo quando provo ad eseguire l'applicazione,nel caso cio' non bastasse per capire dove sta l'inghippo,ho visto che hai msn e potrei contattarti li passandoti l'intero progetto

    http://files-upload.com/files/670433/src.zip

  5. #5
    up! ho modificato quel codice,nel caso qualcuno lo avesse visto!. Il problema era nell'entryAction dello stato che richiamava lo stesso stato ad esempio :
    codice:
    public class Controller extends FSM {
    private State STATO_UNO = new StatoUno();
    private State STATO_DUE = new StatoDue();
    private Orologio o = Orologio.getOrologio()// restituisce un unica istanza per tutti di Orologio che tiene conto del tempoCorrente
    private class StatoUno extends ControllerState{
    public void entryAction() {
     if(o.getCurrentTime()==2) // o.getCurrentTime() restituisce un long
       transition(STATO_DUE);
      else 
       transition(STATO_UNO);
    }
    }
    
    private class StatoDue extends ControllerState {
    ...
    }
    a mio avviso si finisce in ricorsione too deep che genera il java.lang.StackOverflowError.
    naturalmente non posso usare un ciclo while all'interno della entryAction che testa la condizione in quanto il programma fa girare solo quel while e gli altri thread sembrano essere fermi (stranezza,forse mi sbaglio!),nel senso che se inserisco una system.out.println("debug") nei metodi run degli altri thread del programma e non viene visualizzato nulla! percio' suppongo che quei thread siano bloccati fintanto che siamo in quel while... Quindi ho risolto in una maniera che funziona ma non credo sia corretta al 100% .Qualcuno e' disponibile a parlare su msn in modo tale da passargli i files,qui e' un po' lungo scrivere tutto il codice ed e' inutile scrivere le modifiche che ho fatto senza avere tutto il codice sotto mano, qualcuno e' disponibile ? grazie

    p.s. ho visto che lele dovrebbe avere msn, ma prima di aggiungerti vorrei sapere se sei d'accordo

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.