2014-10-20 71 views
1

即時消息處理ArrayList過濾值並傳遞到數據庫,如果記錄重複,則代碼拋出異常,然後更新數據庫中的值並跳轉到下一個記錄。 在記錄90,91或92我得到此異常Java - 空指針將記錄傳遞到數據庫的異常

java.lang.NullPointerException 
at com.icc.utilidades.Conexion.actualizarEstadoAlumno(Conexion.java:4296) 
at com.icc.controlador.AjaxControlador.doGet(AjaxControlador.java:227) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

從conexion 4296的代碼是一個方法和例外是的preparedStatement時

public int actualizarEstadoAlumno(String rut,String estado) 
{ 
    try { 
     ConexionBd(); 
     System.out.println("rut "+rut); 
     System.out.println("estado "+estado); 
     PreparedStatement enunciado = conexion.prepareStatement("update alumno set alu_estado = ? " 
        + "where alu_rut = ? ;"); 
     enunciado.setString(1, rut); 
     enunciado.setString(2, estado); 
     enunciado.execute(); 
     conexion.close(); 
     return 1; 
    } catch (SQLException e) { 
     return 0; 
    } 
} 

當我打印線路值,它們不是null,所以爲什麼我得到這個異常? ,數據庫連接我敢肯定,因爲當我在其他事情中使用該代碼時,這項工作很好。在記錄編號90之前,代碼將值正確傳遞給數據庫。 可能是什麼問題?請幫助。

這是我連接到數據庫

public void ConexionBd() 
{ 
    try 
    { 
     Class.forName("org.postgresql.Driver"); 

     conexion = java.sql.DriverManager.getConnection("jdbc:postgresql://localhost:5432/final","postgres","*******"); 

     consulta = conexion.createStatement(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
} 
+0

看起來像'connection'或任何其他變量都是'null'。你應該總是處理你的例外。在返回數據之前,至少在'catch'語句中使用naive'e.printStacktrace()'。 – 2014-10-20 20:18:52

+0

哪一行是行號4296? – Victor2748 2014-10-20 20:20:45

+0

我檢查所有的變量,如連接,這不是問題,因爲我在應用程序的其他部分使用該方法,工作正常。謝謝 – plarac 2014-10-20 20:23:10

回答

1

當您試圖引用一個對象,比如說你正在調用該對象的一個​​方法,認爲該對象存在,但在運行時期間該對象根本不存在。

對於代碼中的所有可能性,如果對象可能爲null,則取決於運行時方案,您必須放置空指針檢查。我試圖在你的代碼中加入一些空指針檢查,下面看看。我也嘗試了一下你的代碼,但是它可以進一步改進。在下面的代碼中,我假設conexion是一個在給定方法之外初始化的類級變量。

一個快速的注意,當它是關於空指針異常,你不能肯定什麼,去在運行時:)

public int actualizarEstadoAlumno(String rut,String estado) 
{ 
    try { 
     ConexionBd(); 
     System.out.println("rut "+rut); 
     System.out.println("estado "+estado); 
     if(conexion!=null){ 
      PreparedStatement enunciado = conexion.prepareStatement("update alumno set alu_estado = ? " 
        + "where alu_rut = ? ;"); 
      if(enunciado!=null){ 
       enunciado.setString(1, rut); 
       enunciado.setString(2, estado); 
       enunciado.execute(); 
       return 1; 
      } 
     } 

    } catch (SQLException sqlEx) { 
     //return 0; This isn't a good way to handle exception. How will you know that SQL Exception has occurred? You need to handle the exceptions/weird things your code can run into. 
     //log exception, use logger 
     //print stack trace, handle the exception or throw it 
    } catch (Exception ex){ 
     //log exception, use logger 
     //print stack trace, handle the exception or throw it 
    }finally{ 
     conexion.close(); // this is why finally was born. 
    } 
} 
+0

conexion它是空的,但只有在傳遞90條記錄之後,我不知道爲什麼 – plarac 2014-10-20 20:50:14

+0

如果conexion爲空,那麼向我們展示您正在創建和初始化conecxion的代碼。我們可以看到完整的代碼嗎? – 2014-10-20 20:54:01

+0

代碼已更新 – plarac 2014-10-20 20:55:51

0

你的數據字段conexion似乎是空的方法,因此調用conexion.prepareStatement(..) 拋出NPE。在使用之前,您應該首先初始化數據字段。

順便說一句。簡單地捕捉異常並不是一種好的風格。你至少應該記錄錯誤,否則很難找到這樣的錯誤。

0

我沒有看到任何你已經初始化conexion。您必須在try語句的範圍內使用new運算符並初始化連接(連接可以具有全局範圍,但我沒有在您提供的代碼段中看到它)

-1

試試這個:

try { 
       ConexionBd(); 
       System.out.println("rut "+rut); 
       System.out.println("estado "+estado); 
      if(conexion!=null){ 
       PreparedStatement enunciado = conexion.prepareStatement("update alumno set alu_estado = ? " 
          + "where alu_rut = ? ;"); 
      }else{ 
    System.out.println("conexion not initialized (null)"); 

} 
       enunciado.setString(1, rut); 
       enunciado.setString(2, estado); 
       enunciado.execute(); 
       conexion.close(); 
       return 1; 
      } catch (SQLException e) { 
       return 0; 
      } 
+0

conexion它是空的,但只有在傳遞了90條記錄後,我不知道爲什麼 – plarac 2014-10-20 20:51:49

+0

所以在使用它們之前在「rut」和「estado」中檢查null。 – elsadek 2014-10-20 20:56:42

+0

rut和estado的值不爲空 – plarac 2014-10-20 20:59:35