Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

ArrayIndexOutOfBoundsException

No código do Nico, quando ele escreve o seguinte código:

public class TesteScanner {

    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(new File("contas.csv"));

        while(scanner.hasNextLine()){
            String linha = scanner.nextLine();
            System.out.println(linha);

            String[] valores = linha.split(", ");
            System.out.println(valores[3]);
        }
        scanner.close();
    }
}

A saída é

CC,22,33,Nico Steppat,210.1
Nico Steppat
CP,11,55,Luan Silva,1300.98
Luan Silva
CC,22,44,Ana Garcias,350.40
Ana Garcias

Entretanto, quando eu executo o mesmo código, recebo:

"C:\...\IdeaProjects\java-io\out\production\java-io com.possible.TesteScanner
CC,22,33,Nico Steppat,210.1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 1
    at com.possible.TesteScanner.main(TesteScanner.java:20)

Process finished with exit code 1

Se eu imprimo System.out.println(valores); , sem a posição [3], ele roda normalmente. Não entendo por que, quando coloco a posição > 0 ele dá esse erro.. Aparentemente o código do Nico sabe que o array tem pelo menos até a posição [3]. Como ele sabe isso?

4 respostas

Oie Beatriz, tudo bem contigo?

Não é o código do Nico que sabe, foi o próprio Nico que fez isso acontecer, quando é feito assim System.out.println(Arrays.toString(valores)), a linha é printada da seguinte forma [CC,22,33,Nico Steppat,210.1], cada número separado pela virgula é uma casa da array, ou seja, CC é a posição 0, 22 é a posição 1, 33 é a 2, Nico Steppat é a 3, por isso que quando ele coloca valores[3] só os nomes que estão na posição 3 da array são printados.

No seu está dando esse erro, pois ele está falando que a sua array é menor que a posição 3. Por isso te pergunto, como está seu arquivo "contas.csv"? Você fez exatamente igual ao do professor separando por virgula cada informação?

Se puder mandar por aqui seu código da classe "TesteScanner" e o arquivo "contas.csv" para eu dar uma olhada.

Fico no aguardo por sua resposta!

Oi Igor, obrigada pela resposta Eu fiz o download do arquivo .csv do Nico. Aqui meu "TesteScanner":

package com.possible;

import java.io.File;
import java.util.Scanner;

public class TesteScanner {

public static void main(String[] args) throws Exception {
    //                                  \/ usamos o File para abrir o arquivo
    Scanner scanner = new Scanner(new File("contas.csv"));

    while(scanner.hasNextLine()){
        String linha = scanner.nextLine();
        System.out.println(linha);

        String[] valores = linha.split(", ");
        System.out.println(valores[3]);
    }


    scanner.close();

}

}

E aqui o meu contas.csv:

CC,22,33,Nico Steppat,210.1
CP,11,55,Luan Silva,1300.98
CC,22,44,Ana Garcias,350.40

A saída do meu código é:

"C:\...\IdeaProjects\java-io\out\production\java-io com.possible.TesteScanner
CC,22,33,Nico Steppat,210.1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 1
    at com.possible.TesteScanner.main(TesteScanner.java:30)

Process finished with exit code 1
solução!

O que está causando esse erro é um espaço que você colocou após a vírgula em String[] valores = linha.split(", ");, retirando esse espaço ficaria String[] valores = linha.split(",");.

Segue seu código corrigido:

package com.possible;

import java.io.File;
import java.util.Scanner;

public class TesteScanner {

public static void main(String[] args) throws Exception {
    //                                  \/ usamos o File para abrir o arquivo
    Scanner scanner = new Scanner(new File("contas.csv"));

    while(scanner.hasNextLine()){
        String linha = scanner.nextLine();
        System.out.println(linha);
                                                        // o espaço após a vírgula estava causando esse problema
        String[] valores = linha.split(",");
        System.out.println(valores[3]);
    }


    scanner.close();

}

}

Isso acontece, pois é dentro do "split" que é definido o critério de separação, então se você deixar esse espaço, na hora que ele for fazer a leitura do arquivo ele não vai conseguir separar já que não existe espaço em conjunto com a vírgula, apenas existe a vírgula

Veja se agora funciona.

Qualquer coisa estarei por aqui :)

Ai ai ai, a vida de quem programa não é fácil, viu ahahahah Obrigada, Igor!