try todas tipos solo para numeros negativos lista letras las excepciones catch java arrays while-loop numberformatexception

todas - try catch java netbeans



¿Qué es un NumberFormatException y cómo puedo solucionarlo? (9)

Error Message: Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at set07102.Cards.main(Cards.java:68) C:/Users/qasim/AppData/Local/NetBeans/Cache/8.1/executor-snippets/run.xml:53: Java returned: 1 BUILD FAILED (total time: 0 seconds)

Mi bucle while:

while (response != ''q'' && index < 52) { System.out.println(cards[index]); int first_value = Integer.parseInt(cards[index]); int value = 0; //Add a Scanner Scanner scanner = new Scanner(System.in); System.out.println("Will the next card be higher or lower?, press q if you want to quit"); String guess = scanner.nextLine(); if(cards[index].startsWith("Ace")) { value = 1; } if(cards[index].startsWith("2")) { value = 2; } if(cards[index].startsWith("3")) { value = 3; } //checking 4-10 if(cards[index].startsWith("Queen")){ value = 11; } if(cards[index].startsWith("King")){ value = 12; } if(guess.startsWith("h")){ if(value > first_value){ System.out.println("You answer was right, weldone!"); } else { System.out.println("You answer was wrong, try again!"); } } else if(guess.startsWith("l")){ if(value < first_value) { System.out.println("You answer as right, try again!"); } else { System.out.println("You answer was wrong, try again!"); } } else { System.out.println("Your was not valid, try again!"); } scanner.close(); index++; }//end of while loop


¿Qué es una NumberFormatException ?

Esta excepción se produce para indicar que la aplicación ha intentado convertir una string a uno de los tipos numéricos, pero que la string no tiene el formato apropiado.

En su caso, de acuerdo con el seguimiento de su pila, Integer.parseInt(String) lanzó esta excepción, lo que significa que la String proporcionada no contiene un integer analizable. Y aún de acuerdo con el seguimiento de la pila, se debe al hecho de que trataste de analizar el " As de clubes " de la String como un número entero que no puede funcionar, ya que no es la representación de String de un número entero.

¿Como arreglarlo?

La forma más simple y genérica es detectar la excepción NumberFormatException

int value = -1; try { value = Integer.parseInt(myString); } catch (NumberFormatException e) { // The format was incorrect }

Funcionará, pero detectar una excepción es lento porque necesita construir la pila de llamadas para crear la Exception que es costosa, por lo que si puede evitarlo, hágalo. Además, deberá gestionar la excepción correctamente, lo que no siempre es obvio.

O podría usar una regular expression para verificar primero si la String matches con un Integer pero es bastante propensa a errores, ya que podría usar fácilmente una regular expression incorrecta.

En su caso, se debe usar un enfoque más OO en lugar de tratar con String , por ejemplo, podría usar una class o una enum para representar sus tarjetas en lugar de usar String simple porque es mucho más propenso a errores como ya ha notado.

Entonces, si decide usar una clase dedicada para su tarjeta, su código podría ser:

public class Card { private final Rank rank; private final Suit suit; public Card(final Rank rank, final Suit suit) { this.rank = rank; this.suit = suit; } public Rank getRank() { return this.rank; } public Suit getSuit() { return this.suit; } }

Para el palo y el rango de una carta, podemos usar una enum ya que hay cantidades limitadas de rangos y palos existentes.

public enum Rank { ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), HEIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13); private final int value; Rank(final int value) { this.value = value; } public int getValue() { return this.value; } } public enum Suit { SPADE, HEART, DIAMOND, CLUB }

Entonces las cards serían una matriz de Card lugar de una matriz de String , y podrían inicializarse de la siguiente manera:

Rank[] ranks = Rank.values(); Suit[] suits = Suit.values(); Card[] cards = new Card[ranks.length * suits.length]; for (int i = 0; i < ranks.length; i++) { for (int j = 0; j < suits.length; j++) { cards[i * suits.length + j] = new Card(ranks[i], suits[j]); } }

Si necesita barajar su conjunto de tarjetas, puede continuar como sigue (tenga en cuenta que si decide usar una List de tarjetas en lugar de una matriz, simplemente use Collections.shuffle(list) )

List<Card> allCards = Arrays.asList(cards); Collections.shuffle(allCards); allCards.toArray(cards);

Entonces podrá acceder directamente al valor de su tarjeta con las cards[index].getRank().getValue() sin correr el riesgo de obtener una excepción (excepto una IndexOutOfBoundsException si no utiliza un índice adecuado).


La excepción viene en su código, donde convierte la cadena en un entero:

int first_value = Integer.parseInt(cards[index]);

donde pasas una Cadena como "As de clubes" que no es posible convertir como entero, por lo que arroja Excepción de formato de número. Puedes usar,

try { .... // Your Code .... } catch(NumberFormatException e) { e.getMessage(); //You can use anyone like printStackTrace() ,getMessage() to handle the Exception }


Lo primero que me lanzó a un bucle (sin juego de palabras) fue que estaba limitando el valor a 1-13 cuando debe ser 0-52. Además, con su lógica, el valor siempre fue mayor. Un mejor enfoque es con un generador de números. Aquí está mi código usando un generador de números (o Java Random):

public static void main(String[] args) { String[] cards = { "Ace of Clubs", "1 of Clubs", "2 of Clubs", "3 of Clubs", "4 of Clubs", "5 of Clubs", "6 of Clubs", "7 of Clubs", "8 of Clubs", "9 of Clubs", "10 of Clubs", "Queen of Clubs", "King of Clubs", "Ace of Diamonds", "1 of Diamonds", "2 of Diamonds", "3 of Diamonds", "4 of Diamonds", "5 of Diamonds", "6 of Diamonds", "7 of Diamonds", "8 of Diamonds", "9 of Diamonds", "10 of Diamonds", "Queen of Diamonds", "King of Diamonds", "Ace of Hearts", "1 of Hearts", "2 of Hearts", "3 of Hearts", "4 of Hearts", "5 of Hearts", "6 of Hearts", "7 of Hearts", "8 of Hearts", "9 of Hearts", "10 of Hearts", "Queen of Hearts", "King of Hearts", "Ace of Spades", "1 of Spades", "2 of Spades", "3 of Spades", "4 of Spades", "5 of Spades", "6 of Spades", "7 of Spades", "8 of Spades", "9 of Spades", "10 of Spades", "Queen of Spades", "King of Spades" }; Scanner scanner = new Scanner(System.in); Random rand = new Random(); String response = ""; int index = 0; int value = 0; while (!response.equals("q") && index < 52) { // set next card value based on current set of cards in play if (cards[index].endsWith("Clubs")) { value = rand.nextInt(12); } if (cards[index].endsWith("Diamonds")) { value = rand.nextInt(12) + 13; } if (cards[index].endsWith("Hearts")) { value = rand.nextInt(12) + 26; } if (cards[index].endsWith("Spades")) { value = rand.nextInt(12) + 39; } // display card too user (NOTE: we use the random number not the index) System.out.println("Card is: " + cards[value]); // ask user what well the next card be System.out.println("Will the next card be higher or lower?, press q if you want to quit"); response = scanner.nextLine(); // display if user was right (NOTE: compared the random number to the current index) // ignore incorrect response and just continue if ((value > index && response.startsWith("h")) || (value < index && response.startsWith("l"))) { System.out.println("You answer was right, well done!"); } else { System.out.println("You answer was wrong, try again!"); } // continue loop index++; } }

En cuanto a NumberFormatException, creo que Nicolas Filotto hizo un buen trabajo al explicar eso.


NumberFormatException es la forma en que Java tiene que decirle "Traté de convertir una cadena a int y no pude hacerlo".

En su rastro de excepción puede leer

Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at set07102.Cards.main(Cards.java:68)

Básicamente, significa que en la línea 68 de su código usted llama al método Integer.parseInt pasando "Ace of Clubs" como paremeter. Este método espera un valor entero representado como String, por ejemplo, "4", por lo que el método se queja arrojando una NumberFormatException porque "Ace of Clubs" no parece un número entero en absoluto.


Parece que las cards[] son una matriz de cadenas y estás tratando de convertir Ace of Clubs a entero .

int first_value = Integer.parseInt(cards[index]);


Un NumberFormatException significa que Integer.parseInt() no pudo traducir la cadena a un número.

Sugeriría una de dos opciones:

  1. Encapsula las tarjetas como una combinación de nombre (cadena) / valor (int). Use el valor para hacer comparaciones y el nombre para presentar información al usuario. Cards[] luego se convierte en una lista de cartas, no en cadenas.

  2. Analiza las cuerdas tú mismo. Lo que puede ser más fácil, ya que lo has hecho con el if(cards[index].startsWith("Ace")) { value = 1; } if(cards[index].startsWith("Ace")) { value = 1; } bits. Puede moverlos a una función llamada CardToInt() (o lo que sea), y usar esa función en lugar de Integer.parseInt() .


int first_value = Integer.parseInt(cards[index]);

mientras escribe la declaración anterior, está tratando de analizar "As of Clubs" como un número.

puede usar el siguiente método para probar si alguna cadena se puede analizar como Integer:

boolean tryParseInt(String value) { try { Integer.parseInt(value); return true; } catch (NumberFormatException e) { return false; } }

Con respecto a su pregunta, ¿qué es NumberFormatException? Se arroja para indicar que la aplicación ha intentado convertir una cadena a uno de los tipos numéricos, pero que la cadena no tiene el formato apropiado. (ref - Documentation )


java.lang.NumberFormatException

se produce cuando intenta analizar alguna entrada que no es una cadena de números.

En su caso, está tratando de analizar una cadena (que no tiene número) como Integer. Como no es posible, se produjo la excepción NumberFormatException.

int first_value = Integer.parseInt(cards[index]);//cards[index] value should be //number string "123" not "abc"


Error Message: Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at set07102.Cards.main(Cards.java:68) C:/Users/qasim/AppData/Local/NetBeans/Cache/8.1/executor-snippets/run.xml:53: Java returned: 1

medio:

There was an error. We try to give you as much information as possible It was an Exception in main thread. It''s called NumberFormatException and has occurred for input "Ace of Clubs". at line 65th of NumberFormatException.java which is a constructor, which was invoked from Integer.parseInt() which is in file Integer.java in line 580, which was invoked from Integer.parseInt() which is in file Integer.java in line 615, which was invoked from method main in file Cards.java in line 68. It has resulted in exit code 1

En otras palabras, trató de analizar "Ace of Clubs" a un int lo que Java no puede hacer con el método Integer.parseInt . Java ha proporcionado un hermoso stacktrace que te dice exactamente cuál es el problema. La herramienta que está buscando es un depurador y el uso de puntos de interrupción le permitirá inspeccionar el estado de su aplicación en el momento elegido.

La solución podría ser la siguiente lógica en caso de que desee utilizar el análisis :

if (cards[index].startsWith("Ace")) value = 1; else if (cards[index].startsWith("King")) value = 12; else if (cards[index].startsWith("Queen")) value = 11; ... else { try { Integer.parseInt(string.substring(0, cards[index].indexOf(" "))); } catch (NumberFormatException e){ //something went wrong } }

¿Qué es una Exception en Java?

Una excepción es un evento, que ocurre durante la ejecución de un programa, que interrumpe el flujo normal de las instrucciones del programa.

- Documentation

Constructores y uso en Integer#parseInt

static NumberFormatException forInputString(String s) { return new NumberFormatException("For input string: /"" + s + "/""); } public NumberFormatException (String s) { super (s); }

Son importantes para entender cómo leer el stacktrace. Mire cómo se lanza NumberFormatException desde Integer#parseInt :

if (s == null) { throw new NumberFormatException("null"); }

o posterior si el formato de la String s entrada String s no es analizable:

throw NumberFormatException.forInputString(s);

¿Qué es una NumberFormatException ?

Se arroja para indicar que la aplicación ha intentado convertir una cadena a uno de los tipos numéricos, pero que la cadena no tiene el formato apropiado.

- Documentation

NumberFormatException extends IllegalArgumentException . Nos dice que es una IllegalArgumentException más especializada. De hecho, se usa para resaltar que, aunque el tipo de argumento era correcto ( String ), el contenido de la String no era numérico ( a, b, c, d, e, f se consideran dígitos en HEX y son legales cuando es necesario ).

¿Cómo lo soluciono?
Bueno, no arregles el hecho de que está arrojado. Es bueno que sea arrojado. Hay algunas cosas que debes considerar:

  1. ¿Puedo leer el stacktrace?
  2. ¿La String que causa una Exception es null ?
  3. ¿Parece un número?
  4. ¿Es ''mi cadena'' o la entrada del usuario?
  5. continuará

Anuncio. 1)

La primera línea de un mensaje es una información de que ocurrió la excepción y la String entrada que causó el problema. La cadena siempre sigue : y se cita ( "some text" ). Luego te interesas en leer el stacktrace desde el final, ya que las primeras líneas suelen ser el constructor de NumberFormatException , el método de análisis, etc. Luego, al final, está tu método en el que NumberFormatException un error. Se indicará en qué archivo se llamó y en qué método. Incluso se adjuntará una línea. Verás. El ejemplo de cómo leer el stacktrace está arriba.

Anuncio. 2)

Cuando vea, que en lugar de "For input string:" y la entrada, hay un null ( no "null" ) significa que intentó pasar la referencia nula a un número. Si realmente desea tratar es como 0 o cualquier otro número, puede estar interesado en mi otra publicación en . Está disponible here

La descripción de la resolución de null inesperados se describe bien en el subproceso de ¿Qué es una NullPointerException y cómo puedo solucionarlo? .

Anuncio. 3)

Si la String que sigue a : y se cita parece un número en su opinión, puede haber un carácter que su sistema no decodifique o un espacio en blanco invisible. Obviamente " 6" no se puede analizar tan bien como "123 " no. Es por los espacios. Pero puede ocurrir que la String se verá como "6" pero en realidad su longitud será mayor que la cantidad de dígitos que puede ver.

En este caso, sugiero usar el depurador o al menos System.out.println e imprimir la longitud de la String que está intentando analizar. Si muestra más que el número de dígitos, intente pasar stringToParse.trim() al método de análisis. Si no funciona, copie toda la cadena después de : y decodifíquelo usando el decodificador en línea. Te dará códigos de todos los personajes.

También hay un caso que he encontrado recientemente en , que puede ver, que la entrada parece un número, por ejemplo, "1.86" y solo contiene esos 4 caracteres, pero el error aún existe. Recuerde, uno solo puede analizar enteros con # Integer # parseInt #. Para analizar números decimales, uno debe usar Double#parseDouble .

Otra situación es cuando el número tiene muchos dígitos. Puede ser que sea demasiado grande o demasiado pequeño para caber int o long . Es posible que desee probar el new BigDecimal(<str>) .

Anuncio. 4)

Finalmente llegamos al lugar en el que estamos de acuerdo, que no podemos evitar situaciones en las que el usuario escribe "abc" como una cadena numérica. ¿Por qué? Porque el puede. En un caso afortunado, es porque es un probador o simplemente un geek. En un mal caso es el atacante.

¿Qué puedo hacer ahora? Bueno, Java nos da try-catch , puedes hacer lo siguiente:

try { i = Integer.parseInt(myString); } catch (NumberFormatException e) { e.printStackTrace(); //somehow workout the issue with an improper input. It''s up to your business logic. }