Mis*_*u4u 1 java exception-handling exception catch-block
我写了一段代码,以catch具体exception与帮助这个链接.它像是:
catch (SQLException sqle) {
// TODO Auto-generated catch block
String sqlMessage = sqle.getMessage();
String sqlState = sqle.getSQLState();
int vendorCode = sqle.getErrorCode();
System.out.println("Exception occurred:");
System.out.println("Message: " + sqlMessage);
System.out.println("SQL state: " + sqlState);
System.out.println("Vendor code: " + vendorCode);
}
Run Code Online (Sandbox Code Playgroud)
但我得到输出为:
java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.PK_USERID) violated
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:623)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:543)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2960)
at accessdb.Dao.insertnewuser(Dao.java:32)
at Registration.doGet(Registration.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:175)
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.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
如果错误是:
java.sql.SQLException:ORA-00001:违反了唯一约束(SYSTEM.PK_USERID)
我得到了输出
Exception occurred:
Message: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:XE
SQL state: null
Vendor code: 0
Run Code Online (Sandbox Code Playgroud)
如果错误是:
侦听器拒绝连接时出现以下错误:ORA-12505,TNS:侦听器当前不知道连接描述符中给出的SID客户端使用的连接描述符是:localhost:1521:XE.
为什么同一段代码的输出会发生差异?
编辑:
好的,所以这里是try进一步澄清的块.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Authentication and Logging in The Registered User
Getset g=new Getset();
Dao dao=new Dao();
String userid="";
String fname="";
// PrintWriter pw=response.getWriter();
String loginemail=request.getParameter("loginemail");
String loginpassword=request.getParameter("loginpassword");
if(loginemail.equals("")||loginemail.equals(" ")||loginpassword.equals("")||loginpassword.equals(" "))
{
response.sendRedirect("WelcomePage.jsp");
}
else{
g.setloginemail(loginemail);
g.setloginpassword(loginpassword);
try {
ResultSet rs=dao.loginauthentication(g);
while(rs.next()) //Fetching all emails and passwords from user table
{
String regemail=rs.getString("regemail");
String regpassword=rs.getString("regpassword");
System.out.println(""+regemail);
if(loginemail.equals(regemail) && (loginpassword.equals(regpassword))==true)
{
System.out.println("55555");
ResultSet rs1=dao.getnameid(g);
while(rs1.next()) //GET USERID and name FROM NEWUSER TO USE AS PRIMARY KEY
{
userid=rs1.getString("USERID");
fname=rs1.getString("FNAME");
// System.out.println(""+userid);
}
HttpSession session = request.getSession(true);
session.setAttribute("USERID", userid);
session.setAttribute("FNAME", fname);
response.sendRedirect("UserHome.jsp");
return;
}
}
if(rs.next()==false){
System.out.println("caught");
response.sendRedirect("WelcomePage.jsp");
return;
}
}
Run Code Online (Sandbox Code Playgroud)
你没有发布足够的代码来提供明确的答案,但这就是你所谓的"有根据的猜测":try你的catch子句中没有包含这行代码:
accessdb.Dao.insertnewuser(Dao.java:32)
Run Code Online (Sandbox Code Playgroud)
使用新代码,以下假设更加合理:您的insertnewuser方法有自己的try-catch块,如下所示:
try {
...prepare an insert statement...
stmt.executeUpdate(...);
} catch (SQLException e) { e.printStackTrace(); }
Run Code Online (Sandbox Code Playgroud)
这会吞下您的异常并使您的方法正常完成,尽管有异常.解决方案:从该方法中删除整个try-catch块并使方法声明throws SQLException.