java.lang.arrayindexoutofboundsexception

motocross'88

Nuovo Utente
26 Ott 2009
17
0
0
ciao ragazzi! sto creando un algoritmo per la gestione di array paralleli di azioni finanziarie, con le loro quotazioni max e min. una volta inseriti i dati delle azioni (nome, quotazione max, quotazione min), dovrei al "case 4" trovare lo quotazione media globale degli scostamenti. il problema è che quando l'ho testato mi è venuto questo errore "java.lang.arrayindexoutofboundsexception"..mi sembra di capire che sia qualcosa relativo agli indici, ma non riesco capire di più!
qualcuno mi darebbe una mano? grazie tante!!!
vi metto il codice
Codice:
public static void main(String[] args) {
         final int
         	DIM_ARRAY=2;
         double  []
         	quotazioneMaxAzioni, quotazioneMinAzioni;
         String []
         	nomiAzioni;
         String
         	nomeAzioneDaCercare;
         boolean
         	insOK;
         double
         mediaScostamenti,sommaMax, sommaMin;
         int 
         i,
         posizioneAzione,
         opzione;
         
         	
         insOK=false;	
         quotazioneMaxAzioni=new double[DIM_ARRAY];
         quotazioneMinAzioni=new double[DIM_ARRAY];
         nomiAzioni=new String[DIM_ARRAY];
         do{
         	Scrittore.video.println("---------------------");
         	Scrittore.video.println("1* Inserimento dati");
         	Scrittore.video.println("2* Visualizzazione dati");
         	Scrittore.video.println("3* Dati singola Azione");
         	Scrittore.video.println("4* Quotazione media globale degli   scostamenti <Max-Min>");
         	Scrittore.video.println("5* Azione con scostamento Max-Min maggiore");
         	Scrittore.video.println("0* USCITA");
         	Scrittore.video.println("---------------------");
         	opzione=Lettore.tastiera.leggiInt();
           	switch(opzione){
     case 1:
          	for(i=0;i<DIM_ARRAY;i++){
             Scrittore.video.println("Inserire nome azione "+i);
          	nomiAzioni[i]=Lettore.tastiera.leggiString();
          	Scrittore.video.println("Inserire quotazione Max "+nomiAzioni[i]);
          	quotazioneMaxAzioni[i]=Lettore.tastiera.leggiDouble();
          	Scrittore.video.println("Inserire quotazione Min "+nomiAzioni[i]);
          	quotazioneMinAzioni[i]=Lettore.tastiera.leggiDouble();
          	}
	insOK=true;
       	break;
     case 2:
       	if(insOK==true){
       	for(i=0;i<DIM_ARRAY;i++)
          	Scrittore.video.println(nomiAzioni[i]+" Max:"+quotazioneMaxAzioni[i]+" Min:"+quotazioneMinAzioni[i]);
          	}
	else
	Scrittore.video.println("Inserimento non effettuato");
	break;
     case 3: 
	if(insOK==true){
	Scrittore.video.println("Inserire nome azione da cercare");
	nomeAzioneDaCercare=Lettore.tastiera.leggiString();
	posizioneAzione=-1;
	for(i=0;i<DIM_ARRAY;i++)
          	if(nomeAzioneDaCercare.equals(nomiAzioni[i]))
          	posizioneAzione=i;
          	if(posizioneAzione==-1)
          	Scrittore.video.println("Azione non presente in elenco");
          	else
          	Scrittore.video.println("Azione:"+nomiAzioni[posizioneAzione]+
          	" Max:"+quotazioneMaxAzioni[posizioneAzione]+
          	" Min:"+quotazioneMinAzioni[posizioneAzione]);
          	}
	else
	Scrittore.video.println("Inserimento non effettuato");
	break;	
     case 4:
	if(insOK==true){
	sommaMax=0;
	sommaMin=0;
	for(i=0;i<DIM_ARRAY;i++)
          	sommaMax=sommaMax+quotazioneMaxAzioni[i];
          	sommaMin=sommaMin+quotazioneMinAzioni[i];
          	mediaScostamenti=(sommaMax-sommaMin)/(float)DIM_ARRAY;
          	Scrittore.video.println("Media scostamenti "+mediaScostamenti);
	}
	else
	Scrittore.video.println("Inserimento non effettuato");
	break;
             }	
             }while(opzione!=0);
 }
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Ciao Motocross :D benvenuto nel forum,
ti esce l' errore perchè ti sei dimenticato di mettere le parentesi graffe al ciclo for, invece cosi penso che deve andare bene:
Codice:
 case 4:
	if(insOK==true){
	sommaMax=0;
	sommaMin=0;
	for(i=0;i<DIM_ARRAY;i++) {
          	sommaMax=sommaMax+quotazioneMaxAzioni[i];
          	sommaMin=sommaMin+quotazioneMinAzioni[i];
          	mediaScostamenti=(sommaMax-sommaMin)/(float)DIM_ARRAY;
          	System.out.println("Media scostamenti "+mediaScostamenti);
		}
	}
	else
	System.out.println("Inserimento non effettuato");
	break;
perchè senza parentesi graffe al for, fa girare solo l' istruzione successiva, quindi nel tuo caso all'uscita del for
eseguiva solo
Codice:
sommaMax=sommaMax+quotazioneMaxAzioni[i];
e quindi con i = 2 il secondo array era outOfBounds :)

Ciao
 

motocross'88

Nuovo Utente
26 Ott 2009
17
0
0
ciao! grazie lespaul, l'errore è proprio questo!!
ascolta, adesso che funziona però, vedo che mi da 3 risposte, ovvero scostamenti di ogni azione; invece a me interessa quello generale (ovvero la somma degli scostamenti diviso per il numero delle azioni)......come posso modificare il codice?
 
Ultima modifica:

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Ciao, allora devi togliere l' istruzione:
Codice:
Scrittore.video.println("Media scostamenti "+mediaScostamenti);
fuori dal for in questo modo :
Codice:
for(i=0;i<DIM_ARRAY;i++) {
          	sommaMax=sommaMax+quotazioneMaxAzioni[i];
          	sommaMin=sommaMin+quotazioneMinAzioni[i];
          	mediaScostamenti=(sommaMax-sommaMin)/(float)DIM_ARRAY;
}
Scrittore.video.println("Media scostamenti "+mediaScostamenti);
Ciao
 

motocross'88

Nuovo Utente
26 Ott 2009
17
0
0
lespaul, mi aiuteresti a risolvere ultimo problema?...trovare l'azione con il massimo scostamento tra max e min.
ho scritto questo, ma mi da di nuovo il solito errore((
Codice:
	if(insOK==true){
	posizioneAzione=-1;
	maxDiff=quotazioneMaxAzioni[0]-quotazioneMinAzioni[0];
	posizioneMaxDiff=0;
	for(i=1;i<DIM_ARRAY;i++) 
            {
             if(quotazioneMaxAzioni[0]-quotazioneMinAzioni[0]>maxDiff)
          	maxDiff=quotazioneMaxAzioni[0]-quotazioneMinAzioni[0];
            }
	Scrittore.video.println("Azione con scostamento Max"+nomiAzioni[posizioneAzione]);
          	Scrittore.video.println("in posizione "+posizioneAzione);
          	Scrittore.video.println("ha il prezzo massimo pari a "+maxDiff);
          	}
             else
	Scrittore.video.println("Inserimento non effettuato");
            break;
 
Ultima modifica:

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Certo, ;), solo che non ho idea che cosa sia il massimo scostamento :confused:. Comunque, da quanto ho capito dovrebbe essere la differenza
Codice:
maxDiff=quotazioneMaxAzioni[i]-quotazioneMinAzioni[i];
giusto??
Quindi dovresti calcolare il massimo fra le differenze per ogni elemento di indice i ? Se è questo allora ecco il codice:
Codice:
maxDiff=0
for(i=1;i<DIM_ARRAY;i++) {
int diff = quotazioneMaxAzioni[i]-quotazioneMinAzioni[i];
if(diff>maxDiff) maxDiff = diff;
}
Provalo e magari fammi sapere :rolleyes:
Ciao
 

motocross'88

Nuovo Utente
26 Ott 2009
17
0
0
si, hai capito bene. la singola differenza della quotazione, tra max e min di un titolo.
a me hanno suggerito il metodo della sentinella
Codice:
maxDiff=quotazioneMaxAzioni[0]-quotazioneMinAzioni[0];
posizioneMaxDiff=0;
for(i=1;i<DIM_ARRAY;i++) 
  {
if(quotazioneMaxAzioni[i]-quotazioneMinAzioni[i]>maxDiff)
maxDiff=quotazioneMaxAzioni[0]-quotazioneMinAzioni[0];
pero sta sentinella non funziona, forse perchè nn la capisco(

e come hai scritto tu, che avrei fatto anchio cosi, mi da il solito errore..