2010-01-07 23 views
0

生成隨機不,我已經寫了這樣的代碼,但它給exceptions.actually我要生成一個隨機value.save到數據庫中,並返回給用戶問題在Java

import java.math.BigInteger; 
import java.security.SecureRandom; 

public static String recoverpassword(String uid,String ans) { 
    try { 
     verifyans.setString(1,uid); 
     verifyans.setString(2,ans); 
     ResultSet resultSet = verifyans.executeQuery(); 

     if (resultSet.next()) { 
      SecureRandom random = new SecureRandom(); 
      String newpass = new BigInteger(130, random).toString(32); 
      resetpass.setString(1,newpass); 
      resetpass.setString(2,uid); 
      resetpass.executeUpdate();       
      return newpass; 
     } else { 
      return "xxx"; 
     } 

    } catch(Exception e) { 
     System.out.println("exception" +e); 
     e.printStackTrace(); 
     return "xxx"; 
    } 
} 

IM獲得空指針異常,如:

[email protected]] 
exceptionjava.lang.NullPointerException 
java.lang.NullPointerException 
    at org.tranql.connector.jdbc.ConnectionHandle.connectionError(ConnectionHandle.java:103) 
    at org.tranql.connector.jdbc.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:105) 
    at com.ibm.lims.LimsHandler.recoverpassword(LimsHandler.java:940) 
    at org.apache.jsp.recoverpasswordresult_jsp._jspService(recoverpasswordresult_jsp.java:78) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.geronimo.tomcat.valve.DefaultSubjectValve.invoke(DefaultSubjectValve.java:56) 
    at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:406) 
    at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567) 
    at org.apache.geronimo.tomcat.valve.ThreadCleanerValve.invoke(ThreadCleanerValve.java:40) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 
    at java.lang.Thread.run(Unknown Source) 

嘿,我測試的代碼去除那些SecureRandom的類call.i只是像「樣本」雙引號傳遞一個字符串值,並將它的工作。意味着問題出現在securerandom類中。我認爲值在字符串值字段中以整數形式出現,因此數據庫服務器正在發送異常。 PLZ給我一些代碼來產生隨機字符串交替 -

+4

你忘記告訴例外。順便說一下,不知道這是否僅僅是一個虛擬示例,但是您發佈的JDBC代碼肯定不是線程安全的並且是資源泄漏安全的。它可能會導致問題,只有在沒有關於異常/追蹤的信息時才能判斷。 – BalusC 2010-01-07 11:42:17

+0

問題是什麼?請更具體一些。 – 2010-01-07 11:42:27

+0

即時獲取空指針異常 – 2010-01-07 11:52:22

回答

0

你有沒有嘗試用調試器通過這個步驟?

從發佈的代碼看來,可能uid被傳遞爲方法頂部的null。

您也不應將密碼作爲純文本存儲在數據庫中,而應使用密碼的醃製單向散列代替。

+0

嘿我測試代碼刪除那些securerandom類call.i只是傳遞一個字符串值在雙引號 像「樣本」 它的工作。 表示問題出在securerandom類上。我認爲該值是作爲字符串值字段中的整數發生的,因此數據庫服務器正在發送異常。 PLZ給我一些代碼來生成隨機字符串 – 2010-01-07 12:09:36

0

你有的問題是與隨機gen號無關。你可以看看你的數據庫連接參數,在你試圖執行的sql請求中,...但請更具體的「我正在得到NPE」不是一個問題:)

1

有幾個在這裏發揮作用的問題。

首先NPE的根本原因:

java.lang.NullPointerException 
    at org.tranql.connector.jdbc.ConnectionHandle.connectionError(ConnectionHandle.java:103) 

這顯然是在的TranQL JDBC驅動程序的bug。在ConnectionHandle#connectionError()方法中有一些意外的空指針,因此無法處理實際的連接錯誤。爲了解決這個特殊的問題(這樣你不會得到一個NPE,而是一個更清晰的驅動程序特定的驅動程序SQLException),可以升級驅動程序或更換一個更體面的驅動程序(我從來沒有聽說過TranQL)。

至於整個問題的真正原因;從堆棧跟蹤來看,它看起來像沒有活動連接的方式。從非線程安全的代碼來看,它看起來像preparedStatement之前已經被使用過,並且以某種方式被隱式地關閉/從連接中分離出來。

至少,它顯然歸結爲您在那裏的非線程安全和非資源泄漏安全的JDBC代碼。正常的JDBC慣用法是,您應該始終獲取關閉Connection,PreparedStatementResultSet中的最短可能範圍。因此,已經在非常相同的(非靜態的!)方法塊內。語句和結果集不應該在線程間共享。連接可以,但你不應該把它拿在你自己的手中。爲此,請使用適當的連接池API C3P0。

下面是根據理想的JDBC成語的例子:

public String recoverPassword(Long userId, String answer) throws SQLException { 
    Connection connection = null; 
    PreparedStatement verifyAnswer = null; 
    ResultSet resultSet = null; 
    String newPassword = null; 
    PreparedStatement resetPassword = null; 

    try { 
     connection = database.getConnection(); 
     verifyAnswer = connection.prepareStatement(SQL_VERIFY_ANSWER); 
     verifyAnswer.setLong(1, userId); 
     verifyAnswer.setString(2, answer); 
     resultSet = statement.executeQuery(); 

     if (resultSet.next()) { 
      SecureRandom random = new SecureRandom(); 
      newPassword = new BigInteger(130, random).toString(32); 
      resetPassword = connection.prepareStatement(SQL_RESET_PASSWORD); 
      resetPassword.setString(1, newPassword); 
      resetPassword.setLong(2, userId); 
      resetPassword.executeUpdate();       
     } 
    } finally { 
     // Always free resources in reversed order. 
     if (resetPassword != null) try { resetPassword.close(); } catch (SQLException logOrIgnore) {} 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
     if (verifyAnswer != null) try { verifyAnswer.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 

    return newPassword; 
} 

注意,我暗示,userId是一個Long。你真的不想在代碼和數據模型中都有String ID。你可以找到更多關於編寫可靠的JDBC代碼here的信息,提示和其他示例。

也就是說,堆棧跟蹤

at com.ibm.lims.LimsHandler.recoverpassword(LimsHandler.java:940) 
at org.apache.jsp.recoverpasswordresult_jsp._jspService(recoverpasswordresult_jsp.java:78) 

下面的部分意味着你在一個JSP文件中使用老式的小腳本編寫原始Java代碼。爲了節省將來的維護和調試問題,我強烈建議你不要這樣做,但只需使用Servlet類即可。

+0

對不起sir.i m創建連接fine.i m調用另一個類的連接和另一個類來創建該連接的實例。 問題出在安全隨機類 – 2010-01-07 12:19:26

+1

異常沒有說明。這也不是您的JDBC代碼正常工作的藉口。你聲明瞭連接和聲明'static'。如果你在testen環境中工作,它將會工作,但這在多用戶環境中確實是**主要麻煩**。另外,你明確地使用'ResultSet#setString()'作爲新密碼,所以它實際上是一個整數還是一個字符串並不重要。另外,從跟蹤來看,你在IBM工作嗎?你在那邊沒有導師嗎?我真的會諮詢他們,讓他們審查你的代碼。 – BalusC 2010-01-07 12:21:47