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

    Eccezione java.lang.ArrayIndexOutOfBoundsException strana

    Salve ragazzi.
    Ho un problema. Sto eseguendo su un server due thread nei quali ricevo dal client una stringa di comando e successivamente in base al comando dato eseguo un azione.
    In particolare ricevo dal client due file xml.
    In un caso non ho nessun problema. Il file viene correttamente ricevuto.
    Nell'altro caso invece ho un eccezione molto strana dato che è esattamente tutto uguale al primo caso:

    il codice è il seguente:
    if("TI INVIO LE AZIONI ESEGUITE".equals(str)){
    System.out.println("S: CLIENT DICE: '" + str + "'");
    //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE AZIONITOSERVER.xml DAL
    //DISPOSITIVO MOBILE
    byte [] mybytearray2 = new byte [filesize];
    InputStream is2 = client.getInputStream();
    FileOutputStream fos2 = new FileOutputStream("AZIONITOSERVER.xml");
    BufferedOutputStream bos2 = new BufferedOutputStream(fos2);
    bytesRead2 = is2.read(mybytearray2,0,mybytearray2.length);
    current2 = bytesRead2;

    do {
    bytesRead2 = is2.read(mybytearray2, current2, (mybytearray2.length-current2));
    if(bytesRead2 >= 0) current2 += bytesRead2;
    } while(bytesRead2 > -1);

    bos2.write(mybytearray2, 0 , current2);
    bos2.flush();
    long end = System.currentTimeMillis();
    System.out.println("S: SERVER DICE: LOGAZIONITOSERVER.XML RICEVUTO");
    System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE LOGAZIONITOSERVER.XML: "+(end-start));
    bos2.close();


    L'eccezione che mi capita è:

    java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at agenda.bean.TCPDesktopServer.run(TCPDesktopServer. java:104)
    at java.lang.Thread.run(Unknown Source)

    dove la riga TCPDesktopServer.java:104 è la seguente:
    bos2.write(mybytearray2, 0 , current2);

    La cosa strana è che se non eseguo il primo thread cioè l'altro identico a questo, questa eccezione non avviene e tutto funziona, solo che ho bisogno di eseguire entrambi i thread.
    Mi sa tanto di bug.
    Vi ringrazio per l'aiuto.
    Ciao.

  2. #2
    sto sclerando con questa eccezione...non capisco come mai con due pezzi di codice identici uno funziona e uno no....ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhh heeeeeeeeeelp please!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quell'eccezione indica che stai tentando la lettura in una posizione dell'array non valida. Mi spiego, se nell'array ci sono 20 elementi e tu fai

    array[20]

    hai quell'eccezione (visto che sai bene che si inizia a contare da 0, 20 elementi ti fermi a 19).

    La riga in questione è quella in cui provi a fare una copia,

    bos2.write(mybytearray2, 0 , current2);

    significa che uno dei due array non è valido.
    Ti consiglierei di controllare le dimensioni e un debug per sapere runtime quanto valgono le dimensioni.

    Inoltre usa i tag code per il codice, io non ce l'ho fatta a guardare il tuo, mi sono basata su quello che hai evidenziato e sul tipo di eccezione che si presenta

  4. #4
    ....quello che non capisco è come mai quando vado a togliere l'altra parte di codice che è identica a quella in questione a differenza della stringa di comando che viene inviata dal client e letta dal server (ma il resto è tutto uguale, in quanto ricevo un file e lo memorizzo alla stessa maniera) non mi viene generata l'eccezione e funziona in quanto mi ritrovo il file xml correttamente scritto, invece se lascio entrambe le parti mi si genera l'eccezione e uno dei due file xml ricevuti (quello per cui si genera l'eccezione risulta vuoto).
    Posto entrambe le parti con le variabili usate...magari non mi sono accorto di una stupidata.

    codice:
        int filesize=60223866; // filesize temporary hardcoded
                	    int filesize2=60223865;
                	    long start = System.currentTimeMillis();
                	    int bytesRead;
                	    int bytesRead2;
                	    int current = 0;
                	    int current2 = 0;
                	 
                	  Socket client = serverSocket.accept();
     
                		  BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                          String str = in.readLine();
    
     if("TI INVIO LE AZIONI ESEGUITE".equals(str)){
                             System.out.println("S: CLIENT DICE: '" + str + "'");
                               //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE AZIONITOSERVER.xml DAL
                               //DISPOSITIVO MOBILE
                               byte [] mybytearray2  = new byte [filesize2];
                               InputStream is2 = client.getInputStream();
                               FileOutputStream fos2 = new FileOutputStream("AZIONITOSERVER.xml");
                               BufferedOutputStream bos2 = new BufferedOutputStream(fos2);
                               bytesRead2 = is2.read(mybytearray2,0,mybytearray2.length);
                               current2 = bytesRead2;
    
                               do {
                                  bytesRead2 = is2.read(mybytearray2, current2, (mybytearray2.length-current2));
                                  if(bytesRead2 >= 0) current2 += bytesRead2;
                               } while(bytesRead2 > -1);
    
                               bos2.write(mybytearray2, 0 , current2);
                               bos2.flush();
                               long end = System.currentTimeMillis();
                               System.out.println("S: SERVER DICE: LOGAZIONITOSERVER.XML RICEVUTO");
                               System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE LOGAZIONITOSERVER.XML: "+(end-start));
                               bos2.close();
    
    }
    
    if("TI INVIO LE QUANTITA COMPERATE".equals(str)){
                             System.out.println("S: CLIENT DICE: '" + str + "'");
                               //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE QUANTITATOSERVER.xml DAL
                               //DISPOSITIVO MOBILE
                               byte [] mybytearray  = new byte [filesize];
                               InputStream is = client.getInputStream();
                               FileOutputStream fos = new FileOutputStream("QUANTITATOSERVER.xml");
                               BufferedOutputStream bos = new BufferedOutputStream(fos);
                               bytesRead = is.read(mybytearray,0,mybytearray.length);
                               current = bytesRead;
    
                               do {
                                  bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
                                  if(bytesRead >= 0) current += bytesRead;
                               } while(bytesRead > -1);
    
                               bos.write(mybytearray, 0 , current);
                               bos.flush();
                               long end = System.currentTimeMillis();
                               System.out.println("S: SERVER DICE: QUANTITATOSERVER.XML RICEVUTO");
                               System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE QUANTITATOSERVER.XML: "+(end-start));
                               bos.close();
                               }
    grazie mille...ora cmq controllo quanto mi è appena stato suggerito da valia che ringrazio!

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    metti i tag code, almeno si ha la giusta indentazione altrimenti è quasi impossibile da leggere!!!

  6. #6
    ho modificato il messaggio precedente mettendo i tagcode

  7. #7
    ..non riesco proprio a venirne fuori da sta eccezione...

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ti ripeto devi controllare bene che istanzi tutto quello che ti serve e la dimensione, l'eccezione è molto chiara.
    Non ti cullare del fatto che funziona in un altro caso, se c'è anche una sola situazione in cui un algoritmo non fa quello che voglio l'algoritmo non funziona.

    Controlla bene anche come lo imposti e modula bene il problema: hai un solo metodo enorme (con controlli di stringa inefficienti quando potresti semplicemente passarti una sola parola e in base a quella scegliere l'azione).
    Ogni funzionalità deve essere racchiusa in un metodo a parte, dando il nome del file questo deve essere in grado di fare i suoi mestieri senza alcun problema. Qui tu metti tutto insieme, non è un buon modo di programmare.

    Poi metti dei breakpoint ed esegui: devi capire quanto valgono le strutture su cui scrivi e soprattutto se sono istanziate correttamente e/o se non esci dalle dimensioni.

  9. #9
    beccato il perchè genera eccezione...
    bytesRead2 e current2 sono entrambi -1
    e mybytearray2 è un array di tutti 0
    mentre nel primo caso...dove la ricezione del file avviene correttamente
    ho dei valori corretti.

    ora c'è da capirne il motivo....
    tu hai qualche idea?
    ti ringrazio

  10. #10
    a questo punto non vorrei che il problema sia lato client....cioè che il client non invii correttamente i byte del file che il server dovrebbe poi andare a leggere e a memorizzare...
    questo è quello che faccio lato client:

    codice:
     File sdcardDir = Environment.getExternalStorageDirectory();
    		    	   File myFile = new File(sdcardDir,"AZIONITOSERVER.xml");
    	               FileInputStream fis = new FileInputStream(myFile);
    	               BufferedInputStream bis = new BufferedInputStream(fis); 
    	               byte [] mybytearray = new byte [(int)myFile.length()];
    	               bis.read(mybytearray,0,mybytearray.length);
    	               OutputStream os = socket2.getOutputStream(); 
    	               os.write(mybytearray,0, mybytearray.length);
    	               os.flush();

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.