【问题标题】:How can I solve java.lang.Class.forName(Unknown Source) error?如何解决 java.lang.Class.forName(Unknown Source) 错误?
【发布时间】:2017-08-18 10:55:14
【问题描述】:

我正在尝试使用 JDBC 在 Servlet 上创建一个项目。但是错误日志中有一些持续性错误,例如java.lang.Class.forName(Unknown Source)java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)java.lang.Thread.run(Unknown Source) 等。我该如何解决此类错误的发生? 我正在使用 Apache Tomcat v7.0、mySQL Community Server v5.7 和 Eclipse IDE。

这是我的错误日志:

java.lang.ClassNotFoundException: com.mysql.driver.JDBC
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at Register.register(Register.java:10)
    at RegisterServlet.doPost(RegisterServlet.java:34)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

这是JDBC文件代码(Register.java):

import java.sql.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Register {
    public static final Pattern VALID_EMAIL_ADDRESS_REGEX = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
    public static final Pattern VALID_PHONE_NUMBER_REGEX = Pattern.compile("[7-9][0-9]\\d{9}"); // ,Pattern.CASE_INSENSITIVE);
    public static int register(String name,String user,String pass,String cpass,String email, String phone,String city,String state) throws ClassNotFoundException{
        int status=0;
        try{
            Class.forName("com.mysql.driver.JDBC");
            Connection con=DriverManager.getConnection("jdbc:sqlite:localhost:8080/Diary.db");
            System.out.println("Database connected successfully!!");
            PreparedStatement ps=con.prepareStatement("INSERT INTO Trial(name, user, pass, email, phone, city, state, authorized) values(?,?,?,?,?,?,?,?)");
            if(pass!=null && cpass!=null && phone!=null && name!=null && user!=null && city!=null && state!=null){
                Matcher matcher1 = VALID_EMAIL_ADDRESS_REGEX .matcher(email);
                Matcher matcher2 = VALID_PHONE_NUMBER_REGEX .matcher(phone);
                if((pass==cpass) && (matcher1.find()) && (matcher2.find())){
                    ps.setString(1,name);
                    ps.setString(2,user);
                    ps.setString(3,pass);
                    ps.setString(4,email);
                    ps.setString(5,phone);
                    ps.setString(6,city);
                    ps.setString(7,state);
                    ps.setString(8,"yes");

                    status=ps.executeUpdate();
                }
                else{
                    status = 0;
                }
            }
        }catch(SQLException e){e.getMessage();}

        return status;
    }
}

这是我的 servlet (RegisterSevlet.java):

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        int status;
        res.setContentType("text/html");
        PrintWriter out=res.getWriter();        
        String name=req.getParameter("name");
        String user=req.getParameter("user");
        String pass=req.getParameter("pass");
        String cpass=req.getParameter("cpass");
        String email=req.getParameter("email"); 
        String phone=req.getParameter("phone");
        String city=req.getParameter("city");
        String state=req.getParameter("state");
        try {
            status = Register.register(name, user, pass, cpass, email, phone, city, state);             
            if(status > 0){
                out.print("<p>You are successfully registered!</p>");
                req.getRequestDispatcher("login.html").include(req, res);

            }
            else if(status == 0){
                out.println("<p>Enter the information correctly!</p>");
                res.sendRedirect("register.html");
            }

            req.getRequestDispatcher("#").include(req, res);
            out.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}

【问题讨论】:

  • 您的项目中是否包含 JDBC 驱动程序(jar)?
  • 是的,我确实在 servlet 外部库中包含了 JDBC 驱动程序
  • 也分享你的代码。
  • 我现在已经分享了我的代码。

标签: java mysql eclipse servlets


【解决方案1】:
`Class.forName()` 

抛出ClassNotFoundException 您需要为此包含 multicatch 语句(SQLExceptionClassNotFoundException 的捕获相同) 您可以将您的 catch 语句修改为:

catch (ClassNotFoundException | SQLException e) 
       {
           e.printStackTrace();
       }

试试这个。您可以在需要捕获多个异常的任何地方使用 multicatch 语句。

【讨论】:

  • 但它们是两个不同的文件,一个是 JDBC 文件:Register.java,另一个是 servlet:RegisterServlet.java
  • 仅在您使用Class.forName() 的地方使用这个multicatch,即在JDBC 文件Register.java@Code_Ninja 中
  • 即使在使用 multicatch 语句后,我也会收到此错误Error
  • 好吧,这完全是一个不同的错误。这是FileNotFoundException。在您的RegisterServlet.java 中找不到文件/Diary/%23。也许文件名中不包含%,因为您可能在代码中写错了(根据错误报告第44行)。检查出。还。如果您使用的是 IDE(在本例中为 Eclipse),则无需将其写为 /Diary/23 。只需输入文件名,它就会自动搜索文件。如果您确实将该文件命名为 %23,请尝试更改其名称并将其保存在与您的项目相同的文件夹中。
  • 成功了,感谢您的帮助。对不起,我现在投票被低估了。
【解决方案2】:

只要类在编译时存在但在运行时不存在,就会引发此异常。 请在运行时检查您的类路径是否正确,并且您指向有问题的库(在您的情况下是 mysql 连接器 jar)。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2015-09-30
    • 2019-03-06
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多