Erro System.arraycopy();

Pessoal estou com duvidas, não sei se ta correto a forma que estou utilizando o arraycopy.
Eu quero copiar os elementos da array de origem (totalDeCarros) apartir da posição que for fornercida por um usuario em um Scanner(idCarro). jogando no array de destino (carrosAlugados) na posição inicial 0.
parte do codigo abaixo.

case 3:                         
    System.out.print("0 a "+(client.length-1)+", informe seu ID:");
          idClient = sc.nextInt();
          System.out.print(client[idClient].getNome()+" informe o codigo do carro de 0 a "+(totalDeCarros.length-1)+" que você deseja alugar: ");
              idCarro = sc.nextInt();
              System.arraycopy(totalDeCarros,idCarro,carrosAlugados,0,totalDeCarros.length); 

       break; 

está dando erro no arraycopy e não sei se o jeito que coloquei ta certo ou não, acredito que não.
Estou iniciando na area…

Nunca utilizei esse System.arraycopy, você ja tentou copiar esse valores utilizando um For ou Foreach ?

Por exemplo:

for( int posicaoSelecionada= idCarro, posicao = 0; posicaoSelecionada < totalDeCarros.length; posicaoSelecionada++, posicao++){

          carrosAlugados[posicao] = totalDeCarros[posicaoSelecionada]

}

*trecho de codigo feito no comentario, pode conter erros de sintaxe;

1 curtida

Dessa forma vai copiar os dados que estão no array de origem?

sim, o seu vetor de origem é totalDeCarros e o de destino é o carrosAlugados, correto? Teste o que mandei.

System.arraycopy é um método nativo e é bem mais performático do que iterar arrays.

Já consultou a documentação deste método?
Funciona assim:

System.arraycopy​(arrayDeOrigem, posicaoInicialNoArrayDeOrigem, arrayDeDestino, posicaoInicialNoArrayDeDestino, quantidadeDeElementosQueDesejaCopiar);

O código abaixo:

for (int posicaoSelecionada = idCarro, posicao = 0; posicaoSelecionada < totalDeCarros.length; posicaoSelecionada++, posicao++){
    carrosAlugados[posicao] = totalDeCarros[posicaoSelecionada];
}

Ficaria assim utilizando o System.arraycopy:

System.arraycopy(totalDeCarros, posicaoSelecionada, carrosAlugados, 0, totalDeCarros.length);
1 curtida

Fiz dessa forma e estar dando erro, ao inves de passar um valor pra posicaoSelecionada eu estou jogando uma variavel que recebe um valor atraves de um Scanner e por que está dando erro?

Sem você postar o stacktrace fica dificil adivinhar. Por que não posta a exception pra gente?

1 curtida

Poste o erro que esta gerando

Foi mal, estou começando na area e não conhecia os termos e tal. mas é esse ai

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at java.base/java.lang.System.arraycopy(Native Method) at com.company.Main.main(Main.java:112)

Bem interessante, valeeu!

Mas acredito que para alguns casos de iniciante, como o @thsaraiva informou que é, seja melhor praticar logica criando os próprios métodos.

Esse erro é auto-explicativo, tenta pensar um pouquinho no que você tá fazendo… pensa no tamanho dos vetores…

1 curtida

Que foi excedido os limites.

Array totalDeCarros[15].
carrosAlugados[5].
Porem eu quero copiar apenas uma posição do totalDeCarros pra colocar em uma posição em carrosAlugados.

exemplo: totalDeCarros posição 3 e jogar na posição 2 do array carrosAlugados.

De uma olhada no doc da Exception gerada https://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html

Acredito que por estar usando o System.arraycopy, deva ter lido como funciona.
Dei uma olhada rapido no link que foi passado acima, e esta facil entender.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

Os argumentos “src” e “dest” representam os vetores origem e destino, respectivamente. O argumento “srcPos” é a posição inicial no array origem. O argumento “destPos” é a posição inicial no array destino. Por fim, “length” é utilizado para especificarmos o número de elementos que serão copiados.

Aposto que se colocar o seu inicio (digitar) que quer no index >=10 não vai dar o erro …

Aconselho a criar seus próprios métodos agora que esta iniciando, ficará mais fácil entender e aperfeiçoar sua logica.

Não entendi @Lucaaslb, como assim?

Se é uma posição só então não há necessidade de usar arraycopy, faz só assim:

carrosAlugados[2] = totalDeCarros[3];
1 curtida

Muito obrigado @staroski, dessa forma funcionou. Bem simples e eu não soube solucionar :sweat_smile: