Java - Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

 
Vista:
sin imagen de perfil

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Lucho9964 (17 intervenciones) el 04/04/2020 01:54:29
Hola chicos este es mi codigo: no se porque me marca error, si alguien sabe. Gracias.

cada vez que doy en el boton aceptar me marca este error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import java.util.Scanner;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.math.BigInteger;
 
public class NumerosPrimos extends JFrame implements ActionListener{
 
  private JLabel l1, l2, l3;
  private JTextField tf1;
  private JTextArea ta1;
  private JScrollPane sp1;
  private JButton b1;
  String s1 = "";
 
  public NumerosPrimos(){
 
   setLayout(null);
   getContentPane().setBackground(new Color(0,0,0));
   setTitle("#Primo?");
 
   l1 = new JLabel("Introduce tu numero: ");
   l1.setBounds(10,10,200,20);
   l1.setFont(new Font("Time New Romans", 0, 14));
   l1.setForeground(new Color(230,230,230));
   add(l1);
 
   l2 = new JLabel("Tu numero Si es Primo");
   l2.setBounds(10,80,100,20);
   l2.setFont(new Font("Time New Romans", 0, 14));
   l2.setForeground(new Color(230,230,230));
   add(l2);
   l2.setVisible(false);
 
   l3 = new JLabel("Tu numero No es primo");
   l3.setBounds(10,80,100,20);
   l3.setFont(new Font("Time New Romans", 0, 14));
   l3.setForeground(new Color(230,230,230));
   add(l3);
   l3.setVisible(false);
 
   tf1 = new JTextField();
   tf1.setBounds(10,40,150,30);
   tf1.setBackground(new Color(230,230,230));
   tf1.setFont(new Font("Time New Romans", 0, 12));
   tf1.setForeground(new Color(0,0,0));
   add(tf1);
 
   ta1 = new JTextArea();
   ta1.setEditable(false);
   sp1 = new JScrollPane(ta1);
   sp1.setBounds(10,150,400,500);
   sp1.setBackground(new Color(30,30,30));
   sp1.setFont(new Font("Time New Romans", 0, 12));
   sp1.setForeground(new Color(230,230,230));
   add(sp1);
 
   b1 = new JButton("Aceptar");
   b1.setBounds(10,110,150,30);
   b1.setBackground(new Color(30,30,30));
   b1.setFont(new Font("Time New Romans", 0, 14));
   b1.setForeground(new Color(230,230,230));
   add(b1);
   b1.addActionListener(this);
  }
 
   public void actionPerformed(ActionEvent s){
    if(s.getSource() == b1){
     s1 += tf1.getText().replaceAll("\\s","");
     if(s1.equals("")){
      JOptionPane.showMessageDialog(null, "Debe ingresar un numero");
    }else{
     s1 += "\n";
     BigInteger bi1 = new BigInteger(s1);
     BigInteger a = new BigInteger("1");
     BigInteger b = new BigInteger("2");
     BigInteger c = new BigInteger("3");
     BigInteger d = new BigInteger("5");
     BigInteger e = new BigInteger("7");
     int f;
     int g;
     int h;
     int i;
     int j;
     BigInteger k;
     BigInteger l;
     BigInteger m;
     BigInteger n;
     int o;
     int p;
     int q;
     int r;
 
     f = bi1.compareTo(a);
     g = bi1.compareTo(b);
     h = bi1.compareTo(c);
     i = bi1.compareTo(d);
     j = bi1.compareTo(e);
     k = bi1.mod(b);
     l = bi1.mod(c);
     m = bi1.mod(d);
     n = bi1.mod(e);
     o = k.compareTo(a);
     p = l.compareTo(a);
     q = m.compareTo(a);
     r = n.compareTo(a);
 
 
     if(g==0 || h==0 || i==0 || j==0){
      String s2 = new String("el numero" + bi1 + "Si es primo");
      ta1.setText(s2);
      tf1.setText("");
    }else if(f<=0 || o==-1 || p==-1 || q==-1 || r==-1){
      String s3 = new String("el numero" + bi1 + "No es primo");
      ta1.setText(s3);
      tf1.setText("");
    }else{
      String s4 = new String("el numero" + bi1 + "Si es primo");
      ta1.setText(s4);
      tf1.setText("");
    }
   }
  }
 }
  public static void main(String args[]){
   NumerosPrimos np1 = new NumerosPrimos();
   np1.setBounds(0,0,430,740);
   np1.setVisible(true);
   np1.setResizable(false);
   np1.setLocationRelativeTo(null);
 }
}



y este el error:

********
*Error:*
********
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu
t string: "1
"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.math.BigInteger.<init>(Unknown Source)
at java.math.BigInteger.<init>(Unknown Source)
at NumerosPrimos.actionPerformed(NumerosPrimos.java:74)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
rivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Kabuto (1381 intervenciones) el 04/04/2020 11:53:09
Hola.
El problema es que al tomar el valor del JTextField, hay dos cosas que no son correctas:

Primero es que concatenas los valores que se van introduciendo.

1
s1 += tf1.getText().replaceAll("\\s","");

Entonces supón que yo primero pregunto si el 7 es primo.

Vale, y luego quiero preguntar por el 5.
Como estamos concatenando, el programa me va a evaluar el 75, y no el 5.

Si luego pregunto por el 40, me evaluará el 7540, y así continuamente.
Los valores, no se concatenan, se sustituyen y punto:

1
2
//s1 += tf1.getText().replaceAll("\\s","");
s1 = tf1.getText().replaceAll("\\s","");

Segundo, cuando recoges el valor, le añades un salto de línea:
1
s1 += "\n";

Y esto es lo que provoca el error que te sale en pantalla, cuando el compilador intentar convertir s1 (que es un String) a un valor numérico con el que hacer operaciones aritméticas, se encuentra ese salto de línea (el "\n") el cuál no se puede convertir a un valor aritmético.
Fíjate que en el error, donde te indica el input (entrada) que no ha podido convertir, ya se ve que tras el número hay un salto de línea.
No dice input -> "1"
El input es -> "1
"

1
2
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1
"

No le añadas ningún salto de línea no hace falta e impide convertir la cadena a un BigInteger.

Si lo pones así, ya funciona:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void actionPerformed(ActionEvent s){
		if(s.getSource() == b1){
			//s1 += tf1.getText().replaceAll("\\s",""); No hay que concatenar los valores que se introducen
			s1 = tf1.getText().replaceAll("\\s","");
			if(s1.equals("")){
				JOptionPane.showMessageDialog(null, "Debe ingresar un numero");
			}else{
				//s1 += "\n"; Esto impide que la siguiente linea convierta la cadena a BigInt
				BigInteger bi1 = new BigInteger(s1);
				BigInteger a = new BigInteger("1");
				BigInteger b = new BigInteger("2");
				BigInteger c = new BigInteger("3");
				BigInteger d = new BigInteger("5");

Solo queda una cosa por controlar, si el usuario pone números todo irá bien. Pero si mete letras o símbolos raros, de nuevo ocurrirá la misma excepción.
Esto puedes solucionarlo de dos formas.
O envuelves la operación de cálculos en un try catch para capturar la excepción e informar al usuario de que no meta cosas raras, solo números.

O bien le añades al JTextField un KeyListener que haga que cada vez que se teclee un caracter, compruebe si es un un número entre 1 y 9. Y si no lo es, lo rechace.

Puedes añadir a tu clase, esta otra clase anidada que implementa un KeyListener.
Su código comprueba si se ha "typeado" un carácter que esté entre '0' y '9'.
Si está fuera de rango, lo descarta y pide al sistema que haga un "beep" de advertencia al usuario, para que sepa que tecleado algo no aceptable.
Así evitamos que se introduzca nada que no sean cifras numéricas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private class SoloNumeros implements KeyListener {
 
		@Override
		public void keyTyped(KeyEvent e) {
			char caracter = e.getKeyChar();
 
			if (caracter < '0' || caracter > '9') { //No es un carácter entre 0 y 9, lo rechazamos
				e.consume();
				java.awt.Toolkit.getDefaultToolkit().beep(); //Emite un sonido de advertencia
			}
		}
 
		@Override
		public void keyPressed(KeyEvent e) { //Nada que hacer aquí }
 
		@Override
		public void keyReleased(KeyEvent e) { //Nada que hacer aquí }
 
	}

Una vez escrita esta clase, se la añadimos al JtextField para que lo use como Listener

1
2
3
4
5
6
7
tf1 = new JTextField();
		tf1.setBounds(10,40,150,30);
		tf1.setBackground(new Color(230,230,230));
		tf1.setFont(new Font("Time New Romans", 0, 12));
		tf1.setForeground(new Color(0,0,0));
		tf1.addKeyListener(new SoloNumeros()); //Agregamos el objeto KeyListener
		add(tf1);

Y listo, ahora el campo de texto rechazará cualquier cosa que no sean números.

El código completa queda así.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
public class NumerosPrimos extends JFrame implements ActionListener{
 
	private JLabel l1, l2, l3;
	private JTextField tf1;
	private JTextArea ta1;
	private JScrollPane sp1;
	private JButton b1;
	String s1 = "";
 
	public NumerosPrimos(){
 
		setLayout(null);
		getContentPane().setBackground(new Color(0,0,0));
		setTitle("#Primo?");
 
		l1 = new JLabel("Introduce tu numero: ");
		l1.setBounds(10,10,200,20);
		l1.setFont(new Font("Time New Romans", 0, 14));
		l1.setForeground(new Color(230,230,230));
		add(l1);
 
		l2 = new JLabel("Tu numero Si es Primo");
		l2.setBounds(10,80,100,20);
		l2.setFont(new Font("Time New Romans", 0, 14));
		l2.setForeground(new Color(230,230,230));
		add(l2);
		l2.setVisible(false);
 
		l3 = new JLabel("Tu numero No es primo");
		l3.setBounds(10,80,100,20);
		l3.setFont(new Font("Time New Romans", 0, 14));
		l3.setForeground(new Color(230,230,230));
		add(l3);
		l3.setVisible(false);
 
		tf1 = new JTextField();
		tf1.setBounds(10,40,150,30);
		tf1.setBackground(new Color(230,230,230));
		tf1.setFont(new Font("Time New Romans", 0, 12));
		tf1.setForeground(new Color(0,0,0));
		tf1.addKeyListener(new SoloNumeros());
		add(tf1);
 
		ta1 = new JTextArea();
		ta1.setEditable(false);
		sp1 = new JScrollPane(ta1);
		sp1.setBounds(10,150,400,500);
		sp1.setBackground(new Color(30,30,30));
		sp1.setFont(new Font("Time New Romans", 0, 12));
		sp1.setForeground(new Color(230,230,230));
		add(sp1);
 
		b1 = new JButton("Aceptar");
		b1.setBounds(10,110,150,30);
		b1.setBackground(new Color(30,30,30));
		b1.setFont(new Font("Time New Romans", 0, 14));
		b1.setForeground(new Color(230,230,230));
		add(b1);
		b1.addActionListener(this);
	}
 
	private class SoloNumeros implements KeyListener {
 
		@Override
		public void keyTyped(KeyEvent e) {
			char caracter = e.getKeyChar();
 
			if (caracter < '0' || caracter > '9') { //No es un caracter entre 0 y 9, lo rechazamos
				e.consume();
				java.awt.Toolkit.getDefaultToolkit().beep(); //Emite un sonido de advertencia
			}
		}
 
		@Override
		public void keyPressed(KeyEvent e) { }
 
		@Override
		public void keyReleased(KeyEvent e) { }
 
	}
 
	public void actionPerformed(ActionEvent s){
		if(s.getSource() == b1){
			//s1 += tf1.getText().replaceAll("\\s",""); No hay que concatenar los valores que se introducen
			s1 = tf1.getText().replaceAll("\\s","");
			if(s1.equals("")){
				JOptionPane.showMessageDialog(null, "Debe ingresar un numero");
			}else{
				//s1 += "\n"; Esto impide que la siguiente linea convierta la cadena a BigInt
				BigInteger bi1 = new BigInteger(s1);
				BigInteger a = new BigInteger("1");
				BigInteger b = new BigInteger("2");
				BigInteger c = new BigInteger("3");
				BigInteger d = new BigInteger("5");
				BigInteger e = new BigInteger("7");
				int f;
				int g;
				int h;
				int i;
				int j;
				BigInteger k;
				BigInteger l;
				BigInteger m;
				BigInteger n;
				int o;
				int p;
				int q;
				int r;
 
				f = bi1.compareTo(a);
				g = bi1.compareTo(b);
				h = bi1.compareTo(c);
				i = bi1.compareTo(d);
				j = bi1.compareTo(e);
				k = bi1.mod(b);
				l = bi1.mod(c);
				m = bi1.mod(d);
				n = bi1.mod(e);
				o = k.compareTo(a);
				p = l.compareTo(a);
				q = m.compareTo(a);
				r = n.compareTo(a);
 
 
				if(g==0 || h==0 || i==0 || j==0){
					String s2 = new String("el numero" + bi1 + "Si es primo");
					ta1.setText(s2);
					tf1.setText("");
				}else if(f<=0 || o==-1 || p==-1 || q==-1 || r==-1){
					String s3 = new String("el numero" + bi1 + "No es primo");
					ta1.setText(s3);
					tf1.setText("");
				}else{
					String s4 = new String("el numero" + bi1 + "Si es primo");
					ta1.setText(s4);
					tf1.setText("");
				}
			}
		}
	}
	public static void main(String args[]){
		NumerosPrimos np1 = new NumerosPrimos();
		np1.setBounds(0,0,430,740);
		np1.setVisible(true);
		np1.setResizable(false);
		np1.setLocationRelativeTo(null);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Luicho9964 (17 intervenciones) el 04/04/2020 17:02:38
Muchisismas gracias,.

lo estaba haciendo poco a poco y probando, despues le iba a implementar esto lo de no aceptar letras
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por lucho9964 (17 intervenciones) el 04/04/2020 18:08:12
Una pregunta, para que se utilizan esos @override?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Kabuto (1381 intervenciones) el 05/04/2020 00:57:13
@Override, significa "sobreescribir" y es una palabra reservada que se pone antes de algunos métodos para decirle al compilador, y también a quién esté leyendo nuestro código, que el siguiente método va a sobreescribir un método que se está heredando de una superclase, o bien implementando de una interfaz (interface).

En mi código, la clase que he creado implementa la interfaz KeyListener.
Esta interfaz, tiene tres métodos: keyTyped(), keyPressed() y keyReleased().

Cuando a una clase creada por mí, le pido que implemente esta interfaz, el compilador me obliga a que mi clase incluya estos tres métodos.
No importa si les escribo código o no, pero obligatoriamente he de incluirlos. Por eso dos de ellos no tienen código, porque en realidad para lo que quería hacer no los necesito, pero la interfaz KeyListener me obliga a ponerlos.

Si pruebas mi código, verás que si borras alguno de esos métodos, el compilador se quejará y por algún sitio te indicará que faltan métodos por implementar.

La palabra @Override no es obligatoria ponerla, pero es muy recomendable.

Primero, como he dicho antes, para que quien lea mi código sepa que estoy sobreescribiendo un método heredado de otra clase.

Y segundo, para que el compilador sepa que es mi deseo sobreescribir un método heredado.
En este caso, estoy obligado a implementarlos como he dicho.

Pero en otras relaciones de herencia de clases, puedo sobreescribir métodos heredados sin estar obligado. Si al compilador se lo hago saber con la palabra @Override, este revisará que lo estoy sobreescribiendo correctamente y me avisará si me equivoco en algo.


Por ejemplo, es muy habitual en nuestras clases propias sobreescribir el método toString(), que en Java TODAS las clases heredan de la superclase Object

Si quiero sobreescribir este método correctamente, he de indicar que devuelvo un String y he de escribir su nombre correctamente.

Si yo por torpeza, hago esto y escribo mal el nombre:
1
2
3
public String tosTring() {
   //Mi código...
}

Yo puedo pensar que estoy sobreescribiendo el método toString(), pero no es cierto, porque me he equivocado al escribir el nombre. Pero el compilador no se va a quejar, porque va a pensar que yo estoy creando un método nuevo. Y como no se queja, creo que lo he hecho bien, cuando en realidad la estoy cagando.

En cambio, si antepongo la etiqueta @Override

1
2
3
4
@Override
public String tosTring() {
   //Mi código...
}

Con esa etiqueta le estoy pidiendo al compilador que compruebe si realmente estoy sobreescribiendo correctamente un método heredado. Y entonces sí que me va a avisar de que algo estoy haciendo mal, porque en la línea de herencia no existe ningún método con ese nombre, ya que es erróneo.

Gracias a este aviso, me daré cuenta de que he escrito mal el nombre y podre corregirlo.

1
2
3
4
@Override
public String toString() {
   //Mi código...
}

Resumiendo, con esa etiqueta me aseguro de que el compilador comprueba de que estoy sobreescribiendo correctamente un método heredado, ya sea porque yo quiero hacerlo, o sea porque me obliga la herencia de una clase abstracta o una interfaz.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Lucho9964 (17 intervenciones) el 05/04/2020 01:43:07
ahh vale, Gracias

al escribir esto me marca error, segun mis conocimientos no estoy haciendo nada mal, lo he mirado una hora y no.., parecere tonto, pero es que la verdad soy muy principiante, perdon por preguntar tanto:
1
2
3
4
5
BigInteger r = new BigInteger("9");
BigInteger s = new BigInteger("9999999999");
BigInteger t;
 
t = Math.pow(r, s);

me marca eror: (identifier) expected
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu t string: "1

Publicado por Lucho9964 (17 intervenciones) el 05/04/2020 05:35:00
Ya encontré el error, ese metodo no acepta BigInteger.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar