Java catch块中的语句未执行

Java catch块中的语句未执行,java,exception,exception-handling,catch-block,Java,Exception,Exception Handling,Catch Block,我编写了一段代码,在来自的帮助下捕获特定的异常。就像: 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:"

我编写了一段代码,在来自的帮助下捕获特定的异常。就像:

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:Listener当前不知道连接描述符中给定的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; 
        }

    }

这里有两个问题。请注意,这个答案只是猜测,因为您没有发布足够的代码

一方面,当尝试连接到DB服务器时抛出SQLException时,您将获得所需的输出。可能,这意味着您将catch块放在管理与数据库连接的代码块中

另一方面,当您尝试插入NewUser时,会得到一个不希望的输出,DB会引发ORA-00001错误,这反过来会导致SQLException。这意味着到数据库的连接已成功,但插入操作尚未成功


您有两种try-catch结构吗?

这里有两个问题。请注意,这个答案只是猜测,因为您没有发布足够的代码

一方面,当尝试连接到DB服务器时抛出SQLException时,您将获得所需的输出。可能,这意味着您将catch块放在管理与数据库连接的代码块中

另一方面,当您尝试插入NewUser时,会得到一个不希望的输出,DB会引发ORA-00001错误,这反过来会导致SQLException。这意味着到数据库的连接已成功,但插入操作尚未成功


您有两个try-catch结构吗?

您没有发布足够的代码来提供明确的答案,但这就是您所谓的有根据的猜测:try-of-your-catch子句没有包含这行代码:

accessdb.Dao.insertnewuser(Dao.java:32)
对于新代码,以下假设更为合理:insertnewuser方法有自己的try-catch块,如下所示:

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

这会吞噬您的异常,并使您的方法正常完成,尽管存在异常。解决方案:从该方法中删除整个try-catch块,并使该方法声明抛出SQLException。

您没有发布足够的代码来提供明确的答案,但这就是您所谓的有根据的猜测:try-of-your-catch子句没有包含这行代码:

accessdb.Dao.insertnewuser(Dao.java:32)
对于新代码,以下假设更为合理:insertnewuser方法有自己的try-catch块,如下所示:

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

这会吞噬您的异常,并使您的方法正常完成,尽管存在异常。解决方案:从该方法中删除整个try-catch块,并使该方法声明抛出SQLException。

让我加入游戏,让我们也猜猜代码:您正在使用一些持久性抽象,而不是调用flush/ormFlush/what have you->因此无法保证立即插入->因此引发SQLException何时/何地

让我加入游戏,让我们猜一下代码:您正在使用一些持久性抽象,而不是调用flush/ormFlush/what have you->因此无法保证立即插入->因此无论何时何地都会抛出SQLException

你能发布insertnewuser方法吗?实际上它是J2EE项目的一部分。我可以保证,一切都很好。我只是想在用户插入错误内容时,将浏览器中的错误打印给用户。这就是为什么我要尝试捕捉特定的异常。问题到底是什么?带问号的问题为什么同一段代码的输出会有差异@JonLin,我不确定,但我相信问题基本上是问为什么两个java.sql.SQLException案例的输出不同。你能发布insertnewuser方法吗?实际上它是J2EE项目的一部分。我可以保证,一切正常。我只是想在用户插入错误内容时,将浏览器中的错误打印给用户。这就是为什么我要尝试捕捉特定的异常。问题到底是什么?带问号的问题为什么同一段代码的输出会有差异@JonLin,我不确定,但我相信问题基本上是问为什么两个java.sql.SQLException的输出不同。我可以向您保证,插入是在用户注册后立即发生的。我很乐意创建异常以捕获特定的异常。我可以向您保证,插入是在用户注册后立即发生的。我很乐意创建异常,以便专门捕获异常。现在你已经试过了。令人困惑2.T
在调用insertnewuser.Get的代码中仍然没有证据表明我有错误。catch块的代码应该添加到发生异常的类中。我上错课了。谢谢。不,苏比尔,那可能不是最好的办法。相反,删除isnertnewuser中的整个catch块,让异常冒泡!Eclipse无论如何都不允许删除捕获项:Eclipse与此无关,Subir。它只是告诉您有未处理的已检查异常。只要让您的方法声明抛出SQLException,这是提供的两个快速修复方法之一。1。现在你已经试过了。令人困惑2.在调用insertnewuser.Get的代码中仍然没有证据表明我有错误。catch块的代码应该添加到发生异常的类中。我上错课了。谢谢。不,苏比尔,那可能不是最好的办法。相反,删除isnertnewuser中的整个catch块,让异常冒泡!Eclipse无论如何都不允许删除捕获项:Eclipse与此无关,Subir。它只是告诉您有未处理的已检查异常。只要让您的方法声明抛出SQLException,这是提供的两个快速修复方法之一。