【问题标题】:Code runs in Eclipse but gives compilation errors "Cannot resolve symbol" in CMD代码在 Eclipse 中运行,但在 CMD 中给出编译错误“无法解析符号”
【发布时间】:2011-03-24 02:14:45
【问题描述】:

这是我的课:

import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class DisplayAuthors {
static final String JDBC_DRIVER = "com.mysql.jdbc.driver";
static final String DATABASE_URL = "jdbc:mysql://localhost/myfirstdb";
public static void main(String[] args) {
    Connection connection = null;
    Statement statement = null;
    try {
        Class.forName(JDBC_DRIVER);
        connection = DriverManager.getConnection(DATABASE_URL, "root", "1234");
        statement = connection.createStatement();
        ResultSet resultset = statement.executeQuery("SELECT S_ID, S_NAME, AGE, CLASS FROM MYOWN"); 
        ResultSetMetaData metaData = resultset.getMetaData();
        int numberOfColumns = metaData.getColumnCount();
        System.out.println("Table Content");
        for(int i = 1; i<+numberOfColumns; i++)
            System.out.printf("%-8s\t", metaData.getColumnName(i));
        System.out.println();
        ResultSet resultSet;
        while (resultSet.next())
        {
            for (int i = 1; i<+numberOfColumns; i++)
                System.out.printf("%-8s\t", resultSet.getObject(i));
                System.out.println();
        }

    }
    catch ( SQLException sqlException)
    {
        sqlException.printStackTrace();
        System.exit(1);
    }
    catch ( ClassNotFoundException classNotFound)
    {
        classNotFound.printStackTrace();
        System.exit(1);
    }
    finally
    {
        try
        {
            statement.close();
            connection.close();
        }
        catch ( Exception exception )
        {
            exception.printStackTrace();
            System.exit(1);
        }
    }
}
}

这在 Eclipse 中运行良好,输出如下:

testing oracle-character-set-1 against <abc>
PASSED LOSSY
testing oracle-character-set-1 against <ab?c>
PASSED LOSSY
testing oracle-character-set-1 against <XY

我也尝试过在CMD中编译运行,但是出现如下编译错误:

 C:\My Java>javac DisplayAuthors.java
 DisplayAuthors.java:43: cannot resolve symbol
 symbol  : method printf (java.lang.String,java.lang.String)
 location: class java.io.PrintStream
 System.out.printf( "%-8s\t", metaData.getColumnName( i ) );
            ^
 DisplayAuthors.java:49: cannot resolve symbol
 symbol  : method printf (java.lang.String,java.lang.Object)
 location: class java.io.PrintStream
 System.out.printf( "%-8s\t", resultSet.getObject( i ) );
            ^
 2 errors

我该如何解决这个问题?

【问题讨论】:

  • 以后请发布实际代码,而不是更改/未经测试的版本。您的代码中有太多的红鲱鱼。

标签: java eclipse jdbc


【解决方案1】:

您有 2 个变量:resultsetresultSet。第二个没有使用,应该删除。并在您的 while 块中将 resultSet 替换为 resultset

另外,替换行

static final String JDBC_DRIVER = "com.mysql.jdbc.driver";

static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

【讨论】:

    【解决方案2】:

    通过几处更改更新了您的代码。它现在应该至少可以编译了:)。

    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    
    public class DisplayAuthors {
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DATABASE_URL = "jdbc:mysql://localhost/myfirstdb";
    
        public static void main(String[] args) {
            Connection connection = null;
            Statement statement = null;
            try {
                Class.forName(JDBC_DRIVER);
                connection = DriverManager.getConnection(DATABASE_URL, "root",
                        "1234");
                statement = connection.createStatement();
                ResultSet resultset = statement
                        .executeQuery("SELECT S_ID, S_NAME, AGE, CLASS FROM MYOWN");
                ResultSetMetaData metaData = resultset.getMetaData();
                int numberOfColumns = metaData.getColumnCount();
                System.out.println("Table Content");
                for (int i = 1; i < +numberOfColumns; i++)
                    System.out.printf("%-8s\t", metaData.getColumnName(i));
                System.out.println();
                // ResultSet resultSet;
                while (resultset.next()) {
                    for (int i = 1; i < +numberOfColumns; i++)
                        System.out.printf("%-8s\t", resultset.getObject(i));
                    System.out.println();
                }
    
            } catch (SQLException sqlException) {
                sqlException.printStackTrace();
                System.exit(1);
            } catch (ClassNotFoundException classNotFound) {
                classNotFound.printStackTrace();
                System.exit(1);
            } finally {
                try {
                    statement.close();
                    connection.close();
                } catch (Exception exception) {
                    exception.printStackTrace();
                    System.exit(1);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      那些编译错误意味着找不到方法PrintStream#printf()。根据链接的 javadoc,它是在 Java 1.5 中引入的。

      自:

          1.5
      

      这意味着您在 CMD 中使用 Java 1.4 或更早版本。检查您的 PATHJAVA_HOME 环境变量,它应该指向 Java 1.5 或更高版本。


      也就是说,您的 JDBC 代码中至少还有其他三个主要问题:

      1. 您应该永远不要catch 块中使用 finally 调用 System#exit();,因为这样永远不会调用 finally。因此,在这里您仍然会泄漏连接和语句。请将System#exit() 放在代码末尾。

      2. 你也忘了close() ResultSetfinally 中。

      3. 连接、语句和结果集的关闭都应该在自己的 try-catch 块中发生,因为关闭可能会引发异常。想象一下,关闭语句会抛出异常,那么连接将永远不会关闭。所以,改为这样做:

        } finally {
            if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
            if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
            if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
        }
        

      【讨论】:

        【解决方案4】:

        您的代码路径未构建,请尝试创建一个新项目并添加外部库。Npw 复制粘贴源代码到一个新类中。

        试试看!!它对我有用

        【讨论】:

          猜你喜欢
          • 2022-01-25
          • 2012-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多