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

[SOLUCIONADO] problema con funcion error java.lang.NullPointeException

Estas en el tema de problema con funcion error java.lang.NullPointeException en el foro de Java en Foros del Web. saludos amigos esta pregunta la postie en otro foro en el que estoy registrado asi que la pongo aqui para que me den su opinion ...
  #1 (permalink)  
Antiguo 04/09/2013, 07:42
 
Fecha de Ingreso: agosto-2013
Ubicación: d.f.
Mensajes: 38
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta problema con funcion error java.lang.NullPointeException

saludos amigos esta pregunta la postie en otro foro en el que estoy registrado asi que la pongo aqui para que me den su opinion y consejos hacerca de como puedo solucionar esto.

estoy por terminar una aplicacion en la cual hago uso de postgres como gestor de base de datos, tengo el siguiente procedimiento almacenado:

Código:
CREATE OR REPLACE FUNCTION calcular_horas(id character, finicio date, ftermino date)
  RETURNS interval AS
'select sum(t_transcurrido) from checar where (fecha>=finicio and fecha<=ftermino) and id_prestatario=id;'
  LANGUAGE sql
con este procedimiento almacenado obtendo la suma de horas de la columna t_transcurrido cuando se cumple la condicion en el where que es un par de fechas establecidas y el id de un prestador, el tipo d eretorno segun el gestor es interval, este procedimiento ya lo probe en el gestor y si me da el dato correcto, ahora este procedimiento lo llamo en mi aplicativo java en la siguiente funcion:

Código Java:
Ver original
  1. //funcion que realiza el calculo de horas en base al id del prestador,
  2.    //la fecha de inicion y la fecha de termino
  3.    public String CalcularHoras(String id_prestador, String fecha_inicio, String fecha_termino){
  4.    
  5.       //establece conexion con la base de datos  
  6.       conecta=ConectarBD_asistencia_servicio();  
  7.  
  8.       //guarda el total de horas calculadas por el procedimiento almacenado
  9.       String total_horas="";
  10.    
  11.       try{
  12.          //prepara al procedimiento almacenado y pasa los parametros de la
  13.          //funcion para buscar los datos
  14.          pctoCalcularHoras=conecta.prepareCall("{call calcular_horas(?,?,?)}");
  15.          pctoCalcularHoras.setString(1,id_prestador);
  16.          pctoCalcularHoras.setDate(2,Date.valueOf(fecha_inicio));
  17.          pctoCalcularHoras.setDate(3,Date.valueOf(fecha_termino));
  18.          
  19.          SimpleDateFormat formato_hora=new SimpleDateFormat("HH:mm:ss");
  20.          
  21.          //ejecuta el procedimiento almacenado y recorre los registros
  22.          //de la tabla en busca de los datos
  23.          resultado=pctoHoraEntrada.executeQuery();  
  24.          
  25.          while(resultado.next()){
  26.             Date horas_calculadas=resultado.getDate(1);
  27.             //evita que el dato obtenido no sea null si no lo es procede a realizar
  28.             //la busqueda de la fecha y conversion a String en caso contrario
  29.             //sigue el codigo su flujo normal y retorna la variable fechainicio
  30.             //la cual esta debidamente inicializada
  31.             //NOTA: esto se realizo asi para evitar el error java.lang.NullPointerException
  32.             if(horas_calculadas!=null){
  33.                total_horas=total_horas+formato_hora.format(horas_calculadas);
  34.             }//termina if
  35.            
  36.          }//termina while
  37.          //retorna la funcion los datos encontrados por el procedimiento almacenado
  38.          return total_horas;
  39.          
  40.       }//termina try
  41.       catch(Exception e){
  42.          //en caso de existir algun impedimento se despliega un mensaje
  43.          //indicando el error
  44.          JOptionPane.showMessageDialog(null,e,"Advertencia",JOptionPane.WARNING_MESSAGE);
  45.          return null;
  46.       }//termina catch
  47.        
  48.    }//termina funcion CalcularHoras

al yo correr el programa y pasar los parametros requeridos me marca como ya dije el error de java.lang.NullPointeException, entonses puse un breakpoint en el encabezado de la funcion y corri de nuevo el programa para ir paso a paso y saber donde esta el error y lo que observe fue que al llegar a esta linea:

Código Java:
Ver original
  1. resultado=pctoHoraEntrada.executeQuery();

llega a esta linea y al dar el siguiente paso en vez de seguir el flujo normal salta hasta el catch y me muestra este error.

¿ustedes que opinan?, ¿me falta algo?, a mi parecer si falla esta linea tal vez es por el tipo de retorno del procedimiento almacenado (interval) que posiblemente no sea compatible con la variable de tipo ResultSet resultado al momento de ejecutar el query, espero que puedan ayudarme ya que es la ultima parte que me falta para finalizar y poder entregar este programa.

NOTA: pense que el error podria ser causado por el tipo de dato devuelto por la funcion (interval) asi que se me ocurrio hacer un cast para convertirlo en varchar de la siguiente manera:

Código:
CREATE OR REPLACE FUNCTION calcular_horas(id character, finicio date, ftermino date)
  RETURNS character varying AS
'select cast(sum(t_transcurrido) as varchar) from checar where (fecha>=finicio and fecha<=ftermino) and id_prestatario=id;'
  LANGUAGE sql
esto tambien ya lo prove en el gestor de base de datos y si funciona si me devuelve la suma de horas en base a los parametros que le ingreso pero desafortunadamente al yo provarlo en la funcion de java sigue saltando el error en la linea de codigo que les mencione ¿que me sugieren amigos?
__________________
"benditos sean todos los libros, pues cuando abres uno, te sumerges en un mundo nuevo y totalmente diferente..."
  #2 (permalink)  
Antiguo 04/09/2013, 08:06
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: problema con funcion error java.lang.NullPointeException

Para llamar a una función que te va a devolver un sólo valor, usa un preparedstatement con un select normal

SELECT calcular_horas(?,?,?) FROM nombredetabla*

*Las BBDD suelen tener una taba falsa para este tipo de cosas, DUAL en Oracle/MySQL, SYSIBM.SYSDUMMY1 en db2.
__________________
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.
  #3 (permalink)  
Antiguo 04/09/2013, 09:55
 
Fecha de Ingreso: agosto-2013
Ubicación: d.f.
Mensajes: 38
Antigüedad: 10 años, 8 meses
Puntos: 0
Información Respuesta: problema con funcion error java.lang.NullPointeException

ya modifique el codigo pero me sigue marcando el error, pienso yo que puede ser el error por el tipo de dato que es retornado por el procedimiento almacenado (interval) ya que, tengo otras funciones como esta en las cuales mando llamar y ejecutar los procedimientos almacenados con CallableStatement y ninguna me da problemas, creo tambien que pudiera ser que la variable Statement resultado no sea correcta para almacenar los resultados de tipo interval.

yo hice asi esta llamada de procedimientos para evitar teenr que incluir codigo sql directamente en el aplicativo. gracias por la ayuda seguire tratando de resolver este error
__________________
"benditos sean todos los libros, pues cuando abres uno, te sumerges en un mundo nuevo y totalmente diferente..."
  #4 (permalink)  
Antiguo 04/09/2013, 13:30
 
Fecha de Ingreso: septiembre-2013
Mensajes: 1
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: problema con funcion error java.lang.NullPointeException

mmm bueno el null point exception es cuando tratas de usar un objeto que apunta a null, me inclinaria en que revises mas lo que es la variable pctoHoraEntrada podria ser null.. si no la has definido en otro lado del programa.. ya que en el fragmento que nos presentas no sale definido.. en fin, me inclinaria a que eso es..
salu2.
  #5 (permalink)  
Antiguo 04/09/2013, 19:52
 
Fecha de Ingreso: agosto-2013
Ubicación: d.f.
Mensajes: 38
Antigüedad: 10 años, 8 meses
Puntos: 0
Información Respuesta: problema con funcion error java.lang.NullPointeException

jajajaj error mio jejeje eso me pasa por estar de desesperado y programando a la vez jeej bueno en la parte que me mencionas pctoHoraEntrada esa no es asi que la cambie por la de pctoCalcularHoras jejej al correrlo efectivamente si me da el resultado asi queda el codigo:

Código Java:
Ver original
  1. //funcion que realiza el calculo de horas en base al id del prestador,
  2.        //la fecha de inicion y la fecha de termino
  3.        public String CalcularHoras(String id_prestador, String fecha_inicio, String fecha_termino){
  4.        
  5.           //establece conexion con la base de datos  
  6.           conecta=ConectarBD_asistencia_servicio();  
  7.      
  8.           //guarda el total de horas calculadas por el procedimiento almacenado
  9.           String total_horas="";
  10.        
  11.           try{
  12.              //prepara al procedimiento almacenado y pasa los parametros de la
  13.              //funcion para buscar los datos
  14.              pctoCalcularHoras=conecta.prepareCall("{call calcular_horas(?,?,?)}");
  15.              pctoCalcularHoras.setString(1,id_prestador);
  16.              pctoCalcularHoras.setDate(2,Date.valueOf(fecha_inicio));
  17.              pctoCalcularHoras.setDate(3,Date.valueOf(fecha_termino));
  18.              
  19.              SimpleDateFormat formato_hora=new SimpleDateFormat("HH:mm:ss");
  20.              
  21.              //ejecuta el procedimiento almacenado y recorre los registros
  22.              //de la tabla en busca de los datos
  23.              [COLOR="Red"]resultado=pctoCalcularHoras.executeQuery(); [/COLOR]
  24.              
  25.              while(resultado.next()){
  26.                 Date horas_calculadas=resultado.getDate(1);
  27.                 //evita que el dato obtenido no sea null si no lo es procede a realizar
  28.                 //la busqueda de la fecha y conversion a String en caso contrario
  29.                 //sigue el codigo su flujo normal y retorna la variable fechainicio
  30.                 //la cual esta debidamente inicializada
  31.                 //NOTA: esto se realizo asi para evitar el error java.lang.NullPointerException
  32.                 if(horas_calculadas!=null){
  33.                    total_horas=total_horas+formato_hora.format(horas_calculadas);
  34.                 }//termina if
  35.                
  36.              }//termina while
  37.              //retorna la funcion los datos encontrados por el procedimiento almacenado
  38.              return total_horas;
  39.              
  40.           }//termina try
  41.           catch(Exception e){
  42.              //en caso de existir algun impedimento se despliega un mensaje
  43.              //indicando el error
  44.              JOptionPane.showMessageDialog(null,e,"Advertencia",JOptionPane.WARNING_MESSAGE);
  45.              return null;
  46.           }//termina catch
  47.            
  48.        }//termina funcion CalcularHoras

la parte en rojo es la que ya esta corregida como digo si me da el resultado pero me lo da mal es decir las pruebas que yo hice con el procedimiento alamcenado no coinsiden con lo que em arroja en la funcion, esto se debe pienso yo al formato que se le da (ya sea de 12 0 24 horas) por el SimpleDateFormat asi que despues se me ocurrio modificar el procedimiento para que hiciera un cast para convertir de interval a varchar, al realizar pruebas efectivamente me da el resultado solo que en formato varchar entonses se modifica la funcion del aplicativo java, borrando algunas lineas y queda la funcion de la siguiente manera:

Código Java:
Ver original
  1. //funcion que realiza el calculo de horas en base al id del prestador,
  2.    //la fecha de inicio y la fecha de termino
  3.    public String CalcularHoras(String id_prestador, String fecha_inicio, String fecha_termino){
  4.    
  5.       //establece conexion con la base de datos  
  6.       conecta=ConectarBD_asistencia_servicio();  
  7.  
  8.       //guarda el total de horas calculadas por el procedimiento almacenado
  9.       String total_horas="";
  10.    
  11.       try{
  12.          //prepara al procedimiento almacenado y pasa los parametros de la
  13.          //funcion para buscar los datos
  14.          pctoCalcularHoras=conecta.prepareCall("{call calcular_horas(?,?,?)}");
  15.          pctoCalcularHoras.setString(1,id_prestador);
  16.          pctoCalcularHoras.setDate(2,Date.valueOf(fecha_inicio));
  17.          pctoCalcularHoras.setDate(3,Date.valueOf(fecha_termino));
  18.            
  19.          //ejecuta el procedimiento almacenado y recorre los registros
  20.          //de la tabla en busca de los datos
  21.          resultado=pctoCalcularHoras.executeQuery();
  22.          
  23.          while(resultado.next()){
  24.             total_horas=total_horas+resultado.getString(1);
  25.             //evita que el dato obtenido no sea null en caso de que no se encuentre
  26.             //de acuerdo a los parametros pasados en el procedimiento almacenado
  27.             if(total_horas.equals("null")){
  28.                total_horas="";
  29.             }//termina if
  30.            
  31.          }//termina while
  32.          //retorna la funcion los datos encontrados por el procedimiento almacenado
  33.          return total_horas;
  34.          
  35.       }//termina try
  36.       catch(Exception e){
  37.          //en caso de existir algun impedimento se despliega un mensaje
  38.          //indicando el error
  39.          JOptionPane.showMessageDialog(null,e,"Advertencia",JOptionPane.WARNING_MESSAGE);
  40.          return null;
  41.       }//termina catch
  42.        
  43.    }//termina funcion CalcularHoras

jejejej ya con esto ya puedo entregar mi aplicativo, gracias de todas formas por la ayuda brindada.
__________________
"benditos sean todos los libros, pues cuando abres uno, te sumerges en un mundo nuevo y totalmente diferente..."

Etiquetas: funcion, 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:28.