Il problema è dato dalla priorità delle condizione messe nel secondo while
while(linea2[j]!=';' && j<line2.length()){
Infatti supponendo che linea2.lenght = 3 e j=2 allora entra nel ciclo e incrimenta j a 3 quando va a valutare la prima codizione booleana (linea2[j]!=';') scoppia perchè ovviamente vai oltre la lunghezza dell'array, per risolvero ti basta girare le condizione cioè prima controllare che l'indice non sia maggiore o uguale alla lunghezza dell'array e poi se il carattere.