Otro

Mac 'Índice de cadena fuera de rango: 0' ... ¿Alguien puede decirme qué está mal aquí? (Java)

Chase R

Poster original
8 de mayo de 2008
PDX
  • 2 de junio de 2009
Acabo de terminar de escribir este programa para mi clase de Java. Es un programa simple que calcula cuánto cuesta instalar una cerca. Al final, pregunta '¿le gustaría hacer otra estimación (Y / N)?', Y se supone que el usuario debe elegir sí o no. Sin embargo, después de que termine de ejecutar el mío, no obtendré esa opción, solo dice:

Calcular otra estimación (Y / N): excepción en el hilo 'principal' java.lang.StringIndexOutOfBoundsException: índice de cadena fuera de rango: 0
en java.lang.String.charAt (String.java:558)
en Test1.main (Test1.java:73)

¿Por qué está haciendo esto?

Por cierto, aquí está el 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 junio de 2004


Rochester, Nueva York
  • 2 de junio de 2009
Vaya, eso es complicado. Lo hice funcionar cambiando su último 'read.nextLine ()' a solo 'read.next ()', pero miraré un poco más de cerca para ver por qué no funciona de la primera manera.

Editar: Parece tener algo que ver con el método nextLine () que hace avanzar el puntero más allá de la línea actual. Yo no lo entiendo mucho, pero estos enlaces pueden ayudar a aclarar un poco la confusión:

Escáner de API
Publicación relacionada en el foro

HiRez

6 de enero de 2004
Oeste de EE. UU.
  • 2 de junio de 2009
Voy a adivinar que uno de tus tuyos anterior las llamadas de lectura dejan el carácter de nueva línea en el búfer de entrada del teclado. Por lo tanto, cuando llama a nextLine (), obtiene una cadena vacía, lo que lleva a la excepción al intentar examinar el carácter en la posición 0, ya que no hay ninguno. Esto también es un problema con muchas de las funciones de entrada C de la consola. De alguna manera probablemente desee vaciar el búfer primero con una llamada de lectura ficticia o algo así. No he usado Java en mucho tiempo, así que no sé cuál sería exactamente el procedimiento correcto.

gnasher729

Suspendido
25 de noviembre de 2005
  • 2 de junio de 2009
Chase R dijo: Acabo de terminar de escribir este programa para mi clase de Java. Es un programa simple que calcula cuánto cuesta instalar una cerca. Al final, pregunta '¿le gustaría hacer otra estimación (Y / N)?', Y se supone que el usuario debe elegir sí o no. Sin embargo, después de que termine de ejecutar el mío, no obtendré esa opción, solo dice:

Calcular otra estimación (Y / N): excepción en el hilo 'principal' java.lang.StringIndexOutOfBoundsException: índice de cadena fuera de rango: 0
en java.lang.String.charAt (String.java:558)
en Test1.main (Test1.java:73)

¿Por qué está haciendo esto?

Dado que tiene el código fuente, probablemente en un editor de programa que pueda hacer que muestre números de línea, debería poder encontrar dónde está la línea 73 en el archivo Test1.main. Eso le mostrará dónde ocurre el problema.

Ahora tiene una excepción que dice que un índice de 0 está 'fuera de rango'. Si accede a una cadena con n caracteres, ¿cuáles son los índices válidos?

Ahora, ¿puede decirnos exactamente en qué situación el índice 0 no es un índice válido?

Eso debería responder a tu pregunta.

SilentPanda

Moderador emérito
Oct 8, 2002
El bosque de bambú
  • 2 de junio de 2009
gnasher729 dijo: Ya que tiene el código fuente, probablemente en un editor de programa que pueda mostrar números de línea, debería poder encontrar la línea 73 en el archivo Test1.main. Eso le mostrará dónde ocurre el problema.

La linea es:

Código: another1 = read.nextLine();
justo después de que muestra 'Calcular otra estimación (Y / N):'