Domanda

sto lavorando con javax.swing di fare un aplication che genera forme di XML Schema (utilizzando biblioteca JAXFront) e memorizza i dati inseriti dall'utente loro in documenti XML.

ho messo try-catch-finally blocchi quando ne ho bisogno, ma ho un piccolo problema cattura eccezioni quando il thread principale estremità (I fili AWT sono ancora in esecuzione).

Ho due classi che fanno il lavoro principale e le altre classi che non sono importanti per la domanda:

  • Classe principale : ha la seguente struttura. Inizializza l'applicazione e gestisce il telaio principale

    public class Main { 
        public static void main(String[] args) {
            readArgs(); // An INI file with the app config
            Model model = initializeElements(args); // My model class
            try {
                MyFrame mfr = new MyFrame(title,model);
                mfr.visualize(); // Assembling view and setting visible
            } catch( Excepion e ) {
                doCleanUp();
                System.exit(-1);
            }
        }
    }
  • Telaio Classe : Genera la vista e ascoltare eventi

    public class MyFrame extends JFrame implements ActionListener,MenuListener { 
        // Some attributes
        // Other mthods without importance
        /**
         * Compose the elements, add listeners and set visible the frame
         */
        public void visualize() {
            generateFormPanel();
            setListeners();
            validate();
            setVisible(true);
        }
    
        public MyFrame(String title, Modele model) {
            super(title);
            createElementsUsing(model);
        }
    
        public void actionPerformed(ActionEvent e) {
            // Code to manage events
        }
    }

Bene, il problema è il seguente: Quando la funzione visualize è exectuted dal metodo principale, la vista è generato e mostrato. In quel momento è quando perdo il controllo delle eccezioni cattura. Quindi la mia domanda è se ci sono un modo per catturare i possibili RuntimeExceptions gettato dopo questo punto .

Spero che tu capisca il mio inglese e può rispondere alla domanda.

Grazie in anticipo.

È stato utile?

Soluzione

versione più semplice è quello di impostare il gestore predefinito non rilevata eccezione:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        // do something
    }
});

Ma che cattura le eccezioni non gestite fanno gettato in altre parti del aswell programma.

Si potrebbe tuttavia prendere uniche eccezioni di runtime gettato via alla manifestazione altalena dispacciamento filo utilizzando un proxy (Vedere questa pagina per ulteriori informazioni, copiato da lì):

class EventQueueProxy extends EventQueue {

    protected void dispatchEvent(AWTEvent newEvent) {
        try {
            super.dispatchEvent(newEvent);
        } catch (Throwable t) {
            // do something more useful than: t.printStackTrace();
        }
    }
}

Ora l'installazione in questo modo:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy());

Altri suggerimenti

Dopo aver chiamato visualize() l'unico filo conduttore è lo Swing / AWT filo evento spedizione. Se si desidera catturare tutte le eccezioni è necessario farlo in uno qualsiasi dei vostri metodi listener che vengono chiamati su questo thread per es.

public void actionPerformed(ActionEvent e) {
  try {
    // Some code here
  } catch(RuntimeException e) {
    // Handling code here
  }
}

Per evitare boilerplate si può avere questo codice in una classe di super-.

Si noti che è possibile anche impostare un default non rilevata gestore eccezioni se si vuole qualcosa di cattura non già affrontato dal filo swing / AWT.

Si noti inoltre che in generale è buona norma non sottoclassi di cattura di RuntimeException se si può evitare.

Prova ad aggiungere:

setDefaultCloseOperation(EXIT_ON_CLOSE);

al costruttore MyFrame. Non sono sicuro, però, ma vale la pena provare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top