catch块内的语句不执行(Statements within catch block is not

2019-10-17 02:11发布

我写了一段代码,以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); 
}

但我得到的输出为:

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)

如果错误是:

值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

如果错误是:

监听拒绝与以下错误的连接:ORA-12505,TNS:监听器目前不知道的SID连接描述符中给出的客户端使用的连接描述是:本地主机: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; 
        }

    }

Answer 1:

您还没有发布你的代码,以提供一个明确的答案的就够了,但是这是你所说的“的猜测”:在try你的catch条款不围绕这行代码:

accessdb.Dao.insertnewuser(Dao.java:32)

有了您的新代码,以下假设是更加合理的:你insertnewuser方法都有其自己try-catch块,看起来像这样:

try {
  ...prepare an insert statement...
  stmt.executeUpdate(...);
} catch (SQLException e) { e.printStackTrace(); }

吞下你的异常,使你的方法完全正常尽管异常。 解决办法: 删除整个try-catch从方法块 ,使方法声明throws SQLException



Answer 2:

这里有两个问题。 需要注意的是这个答案只是一个猜测,因为你没有张贴足够的代码。

一方面,你得到所需的输出时SQLException 试图连接到数据库服务器时被抛出。 也许,这意味着,你把你catch块中的代码管理您的数据库连接块。

在另一方面,你想时,你得到不期望的输出insertnewuserORA-00001错误是由DB,这又导致提出SQLException 。 这意味着,到数据库的连接是否成功,但插入操作也没有。

你有两个的try-catch结构?



Answer 3:

让我一起玩“让我们猜码”太:你使用的是持久性的抽象,而不是调用flush() / ormFlush() / what have you - >所以没有直接插入的保障- >这样的SQLException被抛出无论何时何地?



文章来源: Statements within catch block is not executing