Scusa mi sono sbagliato a scrivere sostituisci con:
Codice:
for (i=0; i < a.length && a[i] <= v; i++) {
b[i] = a[i];
k++;
}
if (i == a.length)
k++;
Cioe nella condizione nell'and prima i < a.length e poi a[i] <= v.
Probabilmente il motivo per cui ti lancia ancora quell'eccezione è che quella modifica non cambiava nulla, dato che ancora per fare il check della condizione doveva accedere all'elemento i di a.
Questo se i è maggiore della lunghezza scatena un' eccezione.
In teoria il check i < a.length dovrebbe avvenire sempre prima di accedere ad a[i]; un po come se facessi
Codice:
if (i < a.length)
if (a[i] <= v)
in questo modo non ci può essere mai una eccezione.
Per fortuna questa cosa la puoi fare anche usando semplicemente l'operatore and, dato che Java come quasi tutti i linguaggi imperativi "ottimizza" l'operatore and; infatti and restituisce true solo se entrambi gli operandi sono true; questo vuol dire che se già il primo restituisce false, allora qualunque sia il valore del secondo il risultato sara comunque false.
Per questo motivo se il primo degli operandi è false il secondo non viene neanche controllato.
Tu puoi sfruttare questa cosa considerando che quando viene controllato il secondo operando dell'and, hai la garanzia che il primo è già risultato true (in questo caso hai la garanzia che i rispetta la lunghezza dell'array).
La stessa cosa vale per l'or, per cui se il primo è true, il secondo non viene controllato.