gpt4 book ai didi

java - 使用 java.sql.Connection 在运行时抛出 AbstractMethodError

转载 作者:行者123 更新时间:2023-12-01 12:29:16 27 4
gpt4 key购买 nike

我正在尝试创建一个非常简单的类来将查询发送到 Oracle XE 11g 的实例,本质上是使 非常 简单的 SQL*Plus,以了解 JDBC 的基础知识。

我目前正在使用的源代码是:

public class Example {
static String username, password;
static String dbDriver = "oracle.jdbc.driver.OracleDriver";
static String dbConnection = "jdbc:oracle:thin:@//localhost:1521/xe";

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String line;
Connection c = null;
Statement stmt = null;
int loginAttempts = 0;

// Log in loop
do {
try {
Class.forName(dbDriver);
System.out.print("Enter username: ");
line = input.nextLine();
if (line.contains("/")) {
String[] login = line.split("/");
if (login.length != 2) {
System.out
.println("Unrecognized information, exiting...");
System.exit(0);
}

username = login[0].trim();
password = login[1].trim();
} else {
username = line;
System.out.print("Enter password: ");
password = input.nextLine();
}

c = DriverManager.getConnection(dbConnection, username,
password);
stmt = c.createStatement();
loginAttempts = -1;
} catch (ClassNotFoundException e) {
System.err.println("Unable to connect to database, exiting...");
System.exit(-1);
} catch (SQLException e) {
System.out.println("Username and/or password is incorrect");
if (++loginAttempts == 1) {
System.out.println("Too many failed login attempts, exiting...");
System.exit(0);
}
}
} while (loginAttempts != -1);

// Input loop
for (;;) {
try {
// Write out the prompt text and wait for input
if(c == null) {
throw new IllegalStateException("Connection should not be null");
}
System.out.print(c.getSchema() + ":> ");
String tmp = input.nextLine();

// Check if the user entered "exit"
if (tmp.toLowerCase().equals("exit")) {
System.out.println("Exiting...");
input.close();
System.exit(0);
}

String query;
// TODO: For some reason, no semi-colon is allowed
if (tmp.charAt(tmp.length() - 1) == ';')
query = tmp.split(";")[0];
else
query = tmp;
// System.out.println(query);
ResultSet rset = stmt.executeQuery(query);
ResultSetMetaData rmd = rset.getMetaData();
int colCount = rmd.getColumnCount();

// Column indices start with 1, print column names
for (int i = 1; i <= colCount; i++) {
System.out.printf("%-20.20s ", rmd.getColumnName(i));
}
System.out.println();

while (rset.next()) {
for (int i = 0; i < colCount; i++) {
System.out.printf("%-20.20s | ", rset.getString(i + 1));
}
System.out.println();
}
System.out.println();
} catch (SQLSyntaxErrorException e) {
System.out.println("Encountered a syntax error:\n"
+ e.getMessage());
} catch (SQLException e) {
System.err.println("An unexpected error occurred");
e.printStackTrace();
input.close();
System.exit(-1);
}
}

}
}

在第二个 try/catch 块中,在 for(;;) 循环中,我得到以下输出:
Enter username: hr/hr
Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.getSchema()Ljava/lang/String;
at jdbctest.Example.main(Example.java:69)

我检查了 Oracle docs (java.lang.AbstractMethodError),它说这个错误只能在以下情况下抛出:

“自上次编译当前执行的方法以来,某些类的定义发生了不兼容的更改。”

我想我在第 27 行中遗漏了一些东西,但我不确定如何解决这个问题,任何指导都会非常有帮助。

最佳答案

我相信您的问题是由于您使用 Java <= 6 版本的 JDBC 驱动程序并且使用 Java 7 或更高版本,因为 Java 7 中添加了 Connection#getSchema() 方法。

使用最新版本的 JDBC 驱动程序以避免此类问题,或者至少使用与您的 Java 版本兼容的 JDBC 驱动程序。

关于java - 使用 java.sql.Connection 在运行时抛出 AbstractMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38083719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com