De Outros

Mac 'String index out of range: 0' ... Alguém pode me dizer o que há de errado aqui? (Java)

Chase R

Pôster original
8 de maio de 2008
PDX
  • 2 de junho de 2009
Acabei de escrever este programa para minha classe java. É um programa simples que calcula quanto custa para instalar uma cerca. No final, pergunta 'você gostaria de fazer outra estimativa (S / N)', e o usuário deve escolher sim ou não. No entanto, depois de terminar de executar o meu, não terei essa opção, apenas diz:

Calcule Outra Estimativa (S / N): Exceção no thread 'main' java.lang.StringIndexOutOfBoundsException: Índice de string fora do intervalo: 0
em java.lang.String.charAt (String.java:558)
em Test1.main (Test1.java:73)

Por que está fazendo isso !!!

A propósito, aqui está o programa:

Código: public class Test1 { public static void main( String[] args ) { String customer = ' '; String customerUC = ' '; String type1 = ' '; String type2 = ' '; char type = ' '; String another1 = ' '; char another = 'y'; int fence = 0; int count = 0; double costFoot = 0; double costTotal = 0; double costGrand = 0; Scanner read = new Scanner(System.in); System.out.print( ' ----------SIERRA FENCING COMPANY----------' ); while ( Character.toUpperCase(another) == 'Y' ) { System.out.print( ' Your Name: ' ); customer = read.nextLine(); customerUC = customer.toUpperCase(); System.out.print( ' New Installation (N) or Repair (R): ' ); type1 = read.nextLine(); type2 = type1.toUpperCase(); type = type2.charAt(0); System.out.print( ' Amount of Fencing Needed (linear feet): ' ); fence = read.nextInt(); System.out.print( ' Cost-Per-Foot of Fencing: ' ); costFoot = read.nextDouble(); if ( costFoot > 6 && type == 'N' ) { costFoot = 6; } else if ( costFoot > 5 && type == 'R' ) { costFoot = 5; } costTotal = fence * costFoot; costGrand += costTotal; count++; System.out.print( ' -------------------------------------------------------' ); System.out.print( ' Name: ' + customerUC ); System.out.print( ' Type: ' + type ); System.out.print( ' Linear Fencing: ' + fence + ' feet' ); System.out.print( ' Cost-Per-Foot: $' + costFoot ); System.out.print( ' Total: $' + costTotal ); System.out.print( ' -------------------------------------------------------' ); System.out.print( ' Calculate Another Estimate (Y/N): ' ); another1 = read.nextLine(); another = another1.charAt(0); } System.out.print( ' Grand Total: $' + costGrand ); System.out.print( ' You made ' + count + ' estimates' ); } }

Littleodie914

9 de junho de 2004


Rochester, NY
  • 2 de junho de 2009
Uau, isso é complicado. Comecei a trabalhar alterando seu último 'read.nextLine ()' para apenas 'read.next ()', mas vou olhar um pouco mais de perto para ver por que não funciona da primeira vez.

Editar: Parece ter algo a ver com o método nextLine () avançando o ponteiro além da linha atual. Eu mesmo não entendo muito, mas estes links podem ajudar a esclarecer um pouco a confusão:

Scanner API
Postagem de fórum relacionada

HiRez

6 de janeiro de 2004
Oeste dos Estados Unidos
  • 2 de junho de 2009
Vou adivinhar que um de seus anterior as chamadas de leitura estão deixando o caractere de nova linha no buffer de entrada do teclado. Portanto, ao chamar nextLine (), você obtém uma string vazia, levando à exceção de tentar examinar o caractere na posição 0, já que não há nenhum. Este também é um problema com muitas das funções C de entrada do console. De alguma forma, você provavelmente deseja liberar o buffer primeiro com uma chamada de leitura fictícia ou algo assim. Eu não uso Java há muito tempo, então não sei qual seria o procedimento correto.

gnasher729

Suspenso
25 de novembro de 2005
  • 2 de junho de 2009
Chase R disse: Acabei de escrever este programa para minha classe java. É um programa simples que calcula quanto custa para instalar uma cerca. No final, pergunta 'você gostaria de fazer outra estimativa (S / N)', e o usuário deve escolher sim ou não. No entanto, depois de terminar de executar o meu, não terei essa opção, apenas diz:

Calcule Outra Estimativa (S / N): Exceção no thread 'main' java.lang.StringIndexOutOfBoundsException: Índice de string fora do intervalo: 0
em java.lang.String.charAt (String.java:558)
em Test1.main (Test1.java:73)

Por que está fazendo isso !!!

Como você tem o código-fonte, provavelmente em um editor de programa que pode ser feito para exibir números de linha, você deve ser capaz de encontrar onde está a linha 73 no arquivo Test1.main. Isso vai mostrar onde o problema acontece.

Agora você tem uma exceção que diz que um índice de 0 está 'fora do intervalo'. Se você acessar uma string com n caracteres, quais são os índices válidos?

Agora você pode nos dizer exatamente em que situação o índice 0 não é um índice válido?

Isso deve responder a sua pergunta.

SilentPanda

Moderador emérito
8 de outubro de 2002
A floresta de bambu
  • 2 de junho de 2009
gnasher729 disse: Já que você tem o código-fonte, provavelmente em um editor de programa que pode ser feito para exibir números de linha, você deve ser capaz de encontrar onde está a linha 73 no arquivo Test1.main. Isso vai mostrar onde o problema acontece.

A linha é:

Código: another1 = read.nextLine();
logo após exibe 'Calcular outra estimativa (S / N):'