Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Por qué da error esta línea

Estas en el tema de Por qué da error esta línea en el foro de Java en Foros del Web. No tengo mucha idea de programación en java, pero tengo que modificar un programa que he descompilado en el que aparece la siguiente rutina private ...
  #1 (permalink)  
Antiguo 10/04/2016, 15:12
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Por qué da error esta línea

No tengo mucha idea de programación en java, pero tengo que modificar un programa que he descompilado en el que aparece la siguiente rutina

private static String getSystemProperty(String key, String def)
throws SecurityException
{
(String)AccessController.doPrivileged(new PrivilegedAction() { private final String val$key;
private final String val$def;

public Object run() { return System.getProperty(this.val$key, this.val$def); }
});
}


eclipse, al depurar, me da error en la línea:

(String)AccessController.doPrivileged(new PrivilegedAction() { private final String val$key;
private final String val$def;
public Object run() { return System.getProperty(this.val$key, this.val$def); }


el error que marca es:
Multiple markers at this line
- Type safety: Unchecked invocation doPrivileged(new PrivilegedAction(){}) of the generic method doPrivileged(PrivilegedAction<T>)
of type AccessController
- Type safety: The expression of type new PrivilegedAction(){} needs unchecked conversion to conform to PrivilegedAction<Object>
- Syntax error, insert ";" to complete BlockStatements
- String cannot be resolved to a variable
- PrivilegedAction is a raw type. References to generic type PrivilegedAction<T> should be parameterized
- Syntax error, insert "AssignmentOperator Expression" to complete Assignment

¿Alguien me puede explicar cómo corregirlo?
Un saludo
José Antonio
  #2 (permalink)  
Antiguo 11/04/2016, 00:54
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Por qué da error esta línea

Porque no usas el código fuente original del programa en lugar de tener que descompilarlo, modificarlo y volverlo a compilar?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 11/04/2016, 02:06
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Por qué da error esta línea

No uso el fuente porque no lo tengo.

Ese programa lo hizo una empresa que desapareció y no tengo acceso al fuente.

Ahora hay que cambiar la dirección de una página web a la que se conecta y no me queda más remedio que descompilar cambiar la dirección y volver a compilar, lo que me da muchos errores.

No tengo ni idea de java, aunque comprendo gran parte del código.
Un saludo
  #4 (permalink)  
Antiguo 11/04/2016, 03:19
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Por qué da error esta línea

Buenas,

val$key no es sintaxis de Java valida.

Parece que el decompilador se encuentra con alguna ambiguedad que no es capaz de resolver.

Cual es el decompilador que utilizas? Es el JD-GUI? http://jd.benow.ca/

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 11/04/2016, 04:12
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Por qué da error esta línea

Muchas gracias por tu respuest

Si, es jd-gui 1.4.0
java 1.8.77
y Eclipse Version: Mars.1 Release (4.5.1)

Cual sería la sintaxis correcta?

Un saludo
José Antonio
  #6 (permalink)  
Antiguo 12/04/2016, 00:32
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Por qué da error esta línea

Buenas,

Por ejemplo el val$ no es valido. Has probado a quitarlo? Por lo que indicas en los errores parece que tiene muchos problemas para interpretar tambien los genericos a partir del bytecode. Esto es normal ya que el compilador realiza muchos cambios y optimizaciones que luego resulta casi imposible reconstruir.

Si el proyecto tiene cierta complejidad y ademas no tienes ni idea de Java veo muy complicado lo que intentas hacer, la verdad. Deberias informar de esta dificultad a quien te ha encargado el trabajo para que no piense que simplemente "hay que cambiar un enlace".
Si se encarga un programa a medida y no se exige la entrega del codigo fuente, luego pasan estas cosas.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #7 (permalink)  
Antiguo 14/04/2016, 01:11
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Por qué da error esta línea

Gracias Profesor_Falken

He decompilado todos los jar del programa.
Puedo utilizarlos en el proyecto sin decompilar para evitar errores?
Si se puede, solamente decompilaría el iniciador y el que contiene la dirección.

Un saludo
José Antonio
  #8 (permalink)  
Antiguo 14/04/2016, 03:24
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Por qué da error esta línea

Buenas,

Si, eso seria lo correcto. Modifica solo el jar necesario. Para recompilarlo necesitaras meter en el classpath del compilador todos los jar utilizados.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 14/04/2016, 07:24
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Por qué da error esta línea

Muchas gracias.
Lo probaré a ver si así me da menos errores.
Un saludo
José Antonio
  #10 (permalink)  
Antiguo 17/04/2016, 01:32
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
Respuesta: Por qué da error esta línea

Gracias Profesor_Falken
Siguiendo tus instrucciones he conseguido que funcione (por lo menos en modo debug)

Me ha surgido otro problema, y es que, en el código, se lee el usuario y contraseña para la página donde tiene que conectarse de un fichero de texto, que está en formato:
usuario = pepe
contraseña = pepa

Y lo lee con este código:
Código:
     this.properties = new Properties();

     try {
              this.properties.load(getClass().getClassLoader().getResourceAsStream("cierre.properties"));
          } catch (IOException ex) {
               ex.printStackTrace();
          }
el problema es que no reconoce esta sentencia:
Código:
              this.properties.load(getClass().getClassLoader().getResourceAsStream("cierre.properties"));
por lo que yo la he cambiado para leer el fichero en formato secuencial y separar el contenido de cada línea en partes.

He utilizado la sentencia tokenizer, junto a FileReader y BufferReadeer, modificando el código hasta llegar a esta parte:
Código:
 String a;
 String b;
 while( ( linea = buff.readLine() ) != null ) {
  //Aqui dentro manejamos la linea
	 StringTokenizer st = new StringTokenizer(linea,"=;",true);
     	if(st.countTokens()>2){
     			a=st.nextToken();
     			b=a.replace(" ","");
     			a.replaceAll("\\s","");
     			System.out.println(a); 
     		
         		if(a.indexOf("usuario")>=0){
         			st.nextToken();
         			a=st.nextToken();
         			b=a.replace(" ","");
         			a.replaceAll("\\s","");
         			a="pepe"; // esto lo he puesto para que funcione en la prueba
         			properties.setProperty(CIERRE_USER, a);
         		}
         		if(a.indexOf("clave")>=0){
         			st.nextToken();
         			a=st.nextToken();
         			b=a.replace(" ","");
         			a.replaceAll("\\s","");
         			a="pepa"; // esto lo he puesto para que funcione en la prueba
         			properties.setProperty(CIERRE_PASS, a);
     		}
     	}

     	System.out.println(linea);    
 }
El problema es que los parámetros recogidos llevan algo delante y detrás que impiden el funcionamiento correcto. Para la prueba he colocado los valores manualmente, pero eso invalida el fichero y la facilidad de cambiarlos en el futuro sin tener que retocar el código.

Cuando veo los valores con el debug, aparecen como " pepe " y " pepa ", por lo que está claro que falta algo en la sentencia replaceAll para eliminarlo.

¿Que puedo hacer para que me queden limpios los valores "pepe" y "pepa"?
o ¿Hay otra opción mejor para hacer la separación?

Un saludo
José Antonio Gracia
  #11 (permalink)  
Antiguo 17/04/2016, 02:35
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Por qué da error esta línea

Sería mejor que vieras por qué te da error al hacer la carga mediante Properties, no es normal que no te lo reconozca, aunque no tengo muy claro el significado exacto de que no lo reconoce.

Cita:
El problema es que los parámetros recogidos llevan algo delante y detrás que impiden el funcionamiento correcto. Para la prueba he colocado los valores manualmente, pero eso invalida el fichero y la facilidad de cambiarlos en el futuro sin tener que retocar el código.

Cuando veo los valores con el debug, aparecen como " pepe " y " pepa ", por lo que está claro que falta algo en la sentencia replaceAll para eliminarlo.
Lo normal para eliminar espacios iniciales y finales no es usar replace, sino trim

http://www.tutorialspoint.com/java/java_string_trim.htm

Para eliminar los espacios en blanco, el replaceAll es válido, pero no modifica la cadena, sino que crea una cadena nueva.

b=a.replace(" ","");
a.replaceAll("\\s","");

sustitúyelo por una de las dos

a= a.replaceAll("\\s","");
a= a.replaceAll(" ","");

son equivalentes.

Aparte de eso es una muy mala práctica el que las cadenas acaben en un espacio en blanco. Lo de que llevan algo delante y detrás (distinto del espacio) no lo entiendo y lo de que el archivo se invalida al cambiarlo manualmente tampoco.

Te recomendaría que creases un fichero nuevo de properties, sin copiar/pegar para asegurarte de que el fichero que usáis no está corrupto. Por cierto, los ficheros de properties siempre tienen que tener encoding ISO-8859-1, aunque ese no sea tu problema.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #12 (permalink)  
Antiguo 17/04/2016, 05:30
 
Fecha de Ingreso: enero-2004
Mensajes: 13
Antigüedad: 20 años, 10 meses
Puntos: 0
SOLUCIONADO Respuesta: Por qué da error esta línea

Gracias, Profesor_Falken y Xerelo. También a todos los que colaboran en la lista y nos ayudan a los que, como yo, no tenemos ni idea de java.

No se si os habréis encontrado en la situación de tener que resolver un problema, que si no lo haces, el ciente será sancionado por la misma administración que lo ha generado.
Que vas a un centro de enseñanza, don de dan cursos de muchas cosas, entre ellas java, y nadie se compromete a ayudarte (pagando, por supuesto). Que llamas a la administación responsable, que fue la que entregó el programa, y no consiguel hablar con nadie.
Que cuando, después de cientos de llamadas y contactos, consigues hablar con alguien, su respuesta sea: "Yo no estaba entonces y no tengo ni idea"
No se si son unos ineptos o unos vagos, pero está claro que en vez de cobrar, deberían pagar por el gasto de luz y temperatura.

Repito, muchas gracias a todos por vuestra labor y ayuda.
José Antonio Gracia

Etiquetas: programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:04.