使用Class.forName()时出现“无法找到符号”问题

时间:2010-06-14 03:47:07

标签: java

我的代码中出现cannot find symbol错误。有谁知道什么会导致这个问题?

代码是:

// Register JDBC driver
Class.forName("net.sourceforge.jtds.jdbc.Driver");

,错误输出为:

blah.java:314: cannot find symbol
symbol  : method forName(java.lang.String)
location: class java.lang.Class
                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                     ^
1 error

//STEP 1. Import required packages
import java.sql.*;

public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.sql.jdbc.Driver";

   static final String DB_URL = (":jdbc:jtds:sqlserver://localhost:1433/tempdb" );





   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";

   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("net.sourceforge.jtds.jdbc.Driver");

      //STEP 3: Open a connection

      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      //STEP 4: Execute a query
      System.out.println("Creating database...");
      stmt = conn.createStatement();

      String sql = "CREATE DATABASE ";
      stmt.executeUpdate(sql);
      System.out.println("Database created successfully...");
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye");
}//end main
}//end JDBCExample

2 个答案:

答案 0 :(得分:2)

Class.forName()失败的主要方式是没有在类路径上使用JDBC驱动程序,但这可能是运行时错误,而不是编译时错误,因为您似乎已经到达此处。

使用我的心灵调试能力,我想你可能正在使用GWT。我不相信它允许在客户端(它转换为JavaScript)。所有JDBC的东西都必须留在服务器端。 Google自己发布JRE emulation reference,以便您可以看到允许的内容。

Class支持的方法仅限于:

  • desiredAssertionStatus()
  • getEnumConstants()
  • 的getName()
  • getSuperclass之类()
  • IsArray的()
  • isEnum()
  • isInterface()
  • isPrimitive()
  • toString()

如果我对你正在使用GWT的事实是正确的,那么最好使用GWT-RPC在客户端和服务器之间进行通信,并让服务器本身发出JDBC调用。

如果您想了解有关GWT-RPC的更多信息,请参阅here。 GWT新闻组中有thread,您可以阅读以获取更多信息。

答案 1 :(得分:0)

在某种情况下,您可能在同一个包中有一个名为" Class.java" 的类。在这种情况下,它会忽略 java.lang 包中的" Class.java" 。由于您未在" Class.java" 中实现名为" forName()" 的方法,因此抛出此错误。

当我遇到类似的编译时错误时,我突然想到了。