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

    ExceptionInInitializerError metodo statico

    Ci ho provato e riprovato a capire, ci ho perso molto tempo, ora mi arrendo.
    Ho una classe a cui ho affidato il compito di leggere un file properties con delle chiavi.

    KeysHelper.java
    codice:
    public class KeysHelper {
    
        private static Properties props = new Properties();
    
        static {
            try {
                props.load(props.getClass().getResourceAsStream("/filechiavi.properties"));
            } catch (IOException e) {
                ExceptionHandler.handle(e);
            }
        }
    
        public static String getAPIKey(String key) {
    
            return (String)props.get(key);
        }
    }
    Una seconda classe necessita di una chiave che cerco di recuperare in modo statico:

    KeyUser.java
    codice:
    public class KeyUser {
    
        String pubKey = KeysHelper.getAPIKey("mia_chiave");
    
        public void stampa(){
            System.out.println(pubKey);
        }
    }
    Dentro Main.fx cerco di utilizzare la stampa della seconda classe:

    Main.fx
    codice:
    def keyUser : KeyUser = {} // Crea un'istanza della classe Java KeyUser
    
    function run() {
        keyUser.stampa();
    }
    Il main genera l'eccezione presente nel titolo del post, ci sono problemi di inizializzazione,
    probabilmente le variabili statiche non sono ancora "accessibili"? Come mai?
    Scusate l'ignoranza.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: ExceptionInInitializerError metodo statico

    Originariamente inviato da ^EvAmPiReS^
    Il main genera l'eccezione presente nel titolo del post, ci sono problemi di inizializzazione,
    probabilmente le variabili statiche non sono ancora "accessibili"? Come mai?
    Basta sapere le regole sugli static init-block e sugli inizializzatori di variabili statiche.

    - non possono lanciare eccezioni "checked".
    - possono lanciare eccezioni "unchecked" che però vengono incapsulate dalla JVM in un ExceptionInInitializerError.

    Quindi dedurrei che quel static { ..... } lancia una eccezione unchecked. Quale e perché dovresti scoprirlo (e te lo dice quale è).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mi dice questo:

    codice:
    Caused by: java.lang.NullPointerException
    	at java.util.Properties$LineReader.readLine(Unknown Source)
    	at java.util.Properties.load0(Unknown Source)
    	at java.util.Properties.load(Unknown Source)
    	at test.util.KeysHelper.<clinit>(KeysHelper.java:26)
            ...
    Riga 25
    codice:
    private static Properties props = new Properties();
    Riga 26
    codice:
    props.load(props.getClass().getResourceAsStream("/api_keys.properties"));
    props non è inizializzato? Eppure è statico! Proprio non riesco ad uscirne...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ^EvAmPiReS^
    Riga 25
    codice:
    private static Properties props = new Properties();
    Riga 26
    codice:
    props.load(props.getClass().getResourceAsStream("/api_keys.properties"));
    props non è inizializzato?
    Inizializzato lo è sicuramente .... altrimenti non avrebbe nemmeno invocato load() (dallo stacktrace si vede che lo invoca!).

    La esecuzione degli inizializzatori e init-block è fatta in ordine rigorosamente "testuale". Il campo props è fisicamente prima, quindi fa prima questo, poi dopo il init-block.


    Il perché del NullPointerException purtroppo non mi sembra banalissimo da capire, personalmente dovrei indagare un pochino e fare qualche prova.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    La chiamata statica è corretta, il problema è la locazione del file.
    Infatti se provo in locale a spostare il file properties dentro la stessa cartella
    del file build.xml di netbeans, il progetto viene eseguito correttamente.
    Come si fa a dirgli che il file si trova dentro il package di default e non nella root del
    progetto?

    codice:
    props.load(props.getClass().getResourceAsStream("/api_keys.properties"));
    Facendo così lui assume che il percorso sia:

    codice:
    System.getProperty("user.dir")/api_keys.properties
    che non è quello corretto! Tra l'altro una volta risolto questo problema, devo anche
    trasferire manualmente il progetto su un server Apache

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ^EvAmPiReS^
    Come si fa a dirgli che il file si trova dentro il package di default e non nella root del
    progetto?

    codice:
    props.load(props.getClass().getResourceAsStream("/api_keys.properties"));
    "/api_keys.properties" indica che la risorsa api_keys.properties viene cercata lungo il classpath alla "radice" (non in un package, per intenderci).

    Se la applicazione è avviata quando è pacchettizzata in un jar, allora api_keys.properties potrebbe/dovrebbe essere messo dentro il jar alla "radice" (non in una cartella). Se non c'è qualcos'altro in classpath dove si potrebbe mettere, chiaramente. Se si lancia java -jar blabla.jar in "classpath" c'è solo blabla.jar (e altri eventuali jar referenziati) e da qui non si scappa ....

    Se la applicazione è avviata avendo in classpath le classi "sfuse" (non in jar), come tipicamente/sicuramente fa un IDE che avvia normalmente la applicazione con le sue opzioni, run/debug, allora le classi sono di certo sotto una cartella es. 'build', 'classes' o nome simile. Bene, lì sotto, non in sotto-cartelle, è la "radice" del classpath.
    Ma nota che non devi di certo andare a mettere lì sotto espressamente dei file (perché è una sezione controllata dalla fase di build). Generalmente (se il progetto è configurato ok), è la fase di build che copia le risorse (file non .java) dal ramo dei sorgenti al ramo di build.
    Pertanto tipicamente basta che quella risorsa sia alla "radice" nel ramo dei sorgenti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Allora:

    api_keys.properties, si trova correttamente nella root / o default package del progetto.
    Questo è confermato dal fatto che, eseguendo l'applicazione in maniera standard,
    tutto va per il verso giusto, ovvero il file viene trovato.
    I problemi cominciano nelle proprietà del progetto, specificando "Run in browser",
    quello che serve a me, ovvero una applet inglobata dentro al browser.
    In questo caso, il file non viene più trovato generando l'eccezione.
    Colpa del classpath di NetBeans? Dove cavolo lo devo mettere sto file, sto perdendo
    un sacco di tempo inutilmente dannazione

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.