todas - try catch java netbeans
¿Qué es un NumberFormatException y cómo puedo solucionarlo? (9)
Esta pregunta ya tiene una respuesta aquí:
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 lastring
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:
-
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. -
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 llamadaCardToInt()
(o lo que sea), y usar esa función en lugar deInteger.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.
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.
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:
- ¿Puedo leer el stacktrace?
-
¿La
String
que causa unaException
esnull
? - ¿Parece un número?
- ¿Es ''mi cadena'' o la entrada del usuario?
- 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.
}