Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Passaggio di variabile tra classi in Java

    Buongiorno, spero che questa sia la sezione giusta. Non so nemmeno se sia il titolo più appropriato per il mio problema, ma ora provo a spiegarvelo.
    Con questa classe voglio effettuare la conversione tra file di log HTTP e IIS:
    codice:
    public class HTTPtoIIS extends Conversion{        
        private String IISversion = "7.5";  //Valori provvisori.
        private String protocolVersion = "1.0";
        FileLoader fl = new HTTPLogHandler();
        
        public String convert() {
            //fl.setFilePath(Constants.LOG_HTTP_PATH);
            fl.parse();
            String converted = null;
            StringBuffer sb = new StringBuffer();
            sb.append(generateHeader());
            
            for (Iterator<HTTPFormat> i = fl.getParsed().iterator(); i.hasNext();) {
                HTTPFormat h = (HTTPFormat) i.next();
                String line = dateGenerator(h) + " " + IIS_UNKNOWN + " " + h.getMethod() + " "
                        + h.getRequest() + " " + IIS_UNKNOWN/*uri query*/ + " " + IIS_UNKNOWN
                        /*porta*/ + " " + h.getUserID() + " " + h.getIPclient() + " " + h.getUserAgent()
                        + " " + h.getStatus() + " 0  0 " + IIS_UNKNOWN;
    
    
                sb.append("\n");
                sb.append(line);
            }
            converted = sb.toString();
            return converted;
        }
        public String generateHeader() {
            fl.parse();
            String header = "#Software: Microsoft Internet Information Services " + IISversion + "\n"
                    + "#Version: " + protocolVersion + "\n"
                    + "#Date: " +dateGenerator(fl.getParsed().get(0)) + "\n"
                    + "#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken";
            return header;
        }
        
        public String dateGenerator(HTTPFormat h) {
            String day = dateZero(h.getDate().get(Calendar.DAY_OF_MONTH));
            String month = dateZero(h.getDate().get(Calendar.MONTH));
            String year = dateZero(h.getDate().get(Calendar.YEAR));
            String hour = dateZero(h.getDate().get(Calendar.HOUR_OF_DAY));
            String minutes = dateZero(h.getDate().get(Calendar.MINUTE));
            String seconds = dateZero(h.getDate().get(Calendar.SECOND));
    
    
            String result = year + "-" + month + "-" + day + " " + hour + ":"
                    + minutes + ":" + seconds;
    
    
            return result;
        }    
        
    }
    Il problema si verifica quando, invece di mettere nel codice il valore di filePath (cioè
    codice:
    setFilePath...
    ) lo passo da una classe esterna, di questo tipo:
    codice:
    public class HTTPtoIIStest {    public static void main(String[] args) {
            HTTPtoIIS h = new HTTPtoIIS();
            h.setFilePath(Constants.LOG_HTTP_PATH);
            System.out.println(h.convert());
        }
    }
    mi da un errore:
    codice:
    Exception in thread "main" java.lang.NullPointerException	at java.io.File.<init>(File.java:277)
    	at tesi.FileLoader.loadFile(FileLoader.java:19)
    	at tesi.HTTPLogHandler.parse(HTTPLogHandler.java:20)
    	at tesi.HTTPtoIIS.convert(HTTPtoIIS.java:19)
    	at test.HTTPtoIIStest.main(HTTPtoIIStest.java:19)
    Java Result: 1
    Vi chiedo aiuto dopo due giorni di emicrania senza riuscire a ricavare nulla... Grazie mille!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    NullPointerException: stai "usando" un oggetto nullo.
    Tale eccezione si verifica nel costruttore della classe File... evidentemente l'oggetto che passi è nullo.
    Stai cercando, quindi, di costruire un oggetto File passando al suo costruttore un "percorso" che è nullo... e questo lo stai facendo nel file FileLoader.java alla riga 19 (classe di cui non sappiamo nulla: non l'hai postata)... tale riga viene invocata alla riga 20 del file HTTPLogHandler (anche questa classe non l'hai postata).
    Quest'ultima classe viene usata alla riga 19 del file HTTPtoIIS... cioè la prima riga del metodo convert().

    Cosa venga fatto all'interno del metodo parse() della classe HTTPLogHandler non ci è dato saperlo, al momento...


    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

  3. #3
    Posto la classe HTTPLogHandler:
    codice:
    public class HTTPLogHandler extends FileLoader{
    
        @Override
        public void parse() {
            for (Iterator<String> i = loadFile().iterator(); i.hasNext();) {
                String next = i.next();
                String[] splitted = next.split(" ", -1);
                
                String ip = splitted[0];
                String usr = splitted[2];
                Calendar date = calendarize(splitted[3]);
                
                String method = removeQuotes(splitted[5]);
                int sepInd = splitted[6].indexOf("/");
                String request = splitted[6].substring(sepInd);
                String protocol = removeQuotes(splitted[7]);
                
                String[] protocolSplit = protocol.split("/");
                String protocolName = protocolSplit[0];
                String protocolVers = protocolSplit[1];
                
                int responseTime = Integer.parseInt(splitted[8]);
                int size = Integer.parseInt(splitted[9]);
                String referer = removeQuotes(splitted[11]);
                String userAgent = next.substring(next.indexOf("("), next.indexOf(")")+1);
                
                HTTPFormat format = new HTTPFormat(ip, usr, date, method, request, protocol, size, size, referer, userAgent);
                parsed.add(format);
    
    
            }
        }
        
        /**
         * Conversione da stringa a formato Calendar.
         * @param s
         * @return 
         */
        public Calendar calendarize(String s){
            s = s.replace("[", "");
            s = s.replace("]", "");
            
            String[] splitted = s.split(" ", -1);
            String dateHour = splitted[0];
            
            int sepIndex = dateHour.indexOf(":");
            String dateString = dateHour.substring(0, sepIndex); //L'indice del separatore è letto correttamente
            String hourString = dateHour.substring(sepIndex+1);
            
            String date[] = dateString.split("/");
            int giorno = Integer.parseInt(date[0]);
            int mese = monthFormat(date[1]);
            int anno = Integer.parseInt(date[2]);
            
            String hour[] = hourString.split(":");
            int hh = Integer.parseInt(hour[0]);
            int mm = Integer.parseInt(hour[1]);
            int ss = Integer.parseInt(hour[2]);
            
            Calendar c = new GregorianCalendar(anno, mese, giorno, hh, mm, ss);
            return c;
        }
        /**
         * Conversione String a formato Integer per i mesi.
         * @param m
         * @return 
         */
        public int monthFormat(String m){
            int month = 0;
            
            if(m.equals("Gen")){
                month = 1;
            } else if(m.equals("Feb")){
                month = 2;
            } else if(m.equals("Mar")){
                month = 3;
            } else if(m.equals("Apr")){
                month = 4;
            } else if(m.equals("May")){
                month = 5;
            } else if(m.equals("Jun")){
                month = 6;
            } else if(m.equals("Jul")){
                month = 7;
            } else if(m.equals("Aug")){
                month = 8;
            } else if(m.equals("Sep")){
                month = 9;
            } else if(m.equals("Oct")){
                month = 10;
            } else if(m.equals("Nov")){
                month = 11;
            } else if(m.equals("Dec")){
                month = 12;
            } 
            return month;
        }
        /**
         * Rimozione virgolette.
         * @param s
         * @return 
         */
        public String removeQuotes(String s){
            char virg = 34;
            String virgolette = String.valueOf(virg);
            s = s.replace(virgolette, "");
            return s;
        }
    
    
    }
    Aggiungo per completezza che Il metodo setFilePath è ereditato dalla classe FileHandler:
    codice:
    public abstract class FileHandler {    List<HTTPFormat> parsed = new LinkedList();
        String filePath;
        
        public List<HTTPFormat> getParsed() {
            return parsed;
        }
    
    
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
        
    }
    Per chiarimenti ovviamente, sono qua!
    Ultima modifica di luca93abc; 16-11-2016 a 12:20

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il problema nasce dalla chiamata al metodo (ereditato) loadFile() che viene fatta nell'inizializzazione del ciclo for. Serve quel metodo... alla riga 19 della classe FileLoader stai passando un oggetto nullo al costruttore della classe File.


    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

  5. #5
    Questo metodo intendi?
    codice:
     public ArrayList<String> loadFile(){        ArrayList<String> letto = new ArrayList<>();
            try {
                String thisLine = null;
                File f = new File(filePath);
                FileReader fr = new FileReader(f);
                BufferedReader br = new BufferedReader(fr);
                while((thisLine = br.readLine())!=null){
                    letto.add(thisLine);
                }
                br.close();
            } catch (IOException ex) {
                System.err.println("Errore nella lettura del file");
            }
            return letto;
        }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Eccola lì:

    codice:
    File f = new File(filePath);

    Chi è che dovrebbe inizializzare la variabile "filePath"? Da quel che hai postato prima dovrebbe occuparsene il metodo "setFilePath()"... che però non viene richiamato da nessuna parte (infatti, nel tuo primo codice è commentata).


    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

  7. #7
    La variabile filePath la inizializzo dalla classe di test, è proprio lì che smette di andare. Se decommentassi quella riga che dici tu funzionerebbe. La mia idea era quella al fine di rendere tutto maggiormente dinamico (scegliere il file da GUI).
    Ciao!

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Nella tua classe HTTPtoISS c'è una variabile di istanza dichiarata in questo modo:

    codice:
    FileLoader fl = new HTTPLogHandler();

    Ed è quella variabile che viene usata al suo interno... ora, se tu vuoi "inizializzarla" altrove, puoi farlo... ma devi passargliela in qualche modo e non lo stai facendo. Al momento tu la stai inizializzando localmente con quell'istruzione che ti ho riportato qui.

    Nel tuo primissimo codice hai detto che dalla classe di test stai eseguendo questa istruzione:

    codice:
    h.setFilePath(Constants.LOG_HTTP_PATH);

    Però nel codice della classe HTTPtoISS che hai postato hai tralasciato proprio il metodo "setFilePath"...
    Evidentemente lì dentro fai qualcosa di sbagliato, ma noi non lo possiamo sapere.


    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

  9. #9
    Il valore della variabile filePath glielo passo da questa classe:
    codice:
    public class HTTPtoIIStest {    public static void main(String[] args) {
            HTTPtoIIS h = new HTTPtoIIS();
            h.setFilePath(Constants.LOG_HTTP_PATH);
            System.out.println(h.convert());
        }
    }
    Poi eseguo un debug del codice, ma filePath resta di valore NULL. È quello che non mi spiego!
    Ciao!!

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    nel codice della classe HTTPtoISS che hai postato hai tralasciato proprio il metodo "setFilePath"...
    Evidentemente lì dentro fai qualcosa di sbagliato, ma noi non lo possiamo sapere.
    Ergo... posta il codice del metodo setFilePatch() della classe HTTPtoISS.


    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

Tag per questa discussione

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.