![](/img/trans.png)
[英]Why do I get an ArrayIndexOutOfBoundsException with this?
[英]Why do I get an ArrayIndexOutOfBoundsException in my JDBC connection?
我是Java的新手,并且尝试使用JDBC连接到UniVerse数据库。 我正在使用Sun Java 6 JDK和NetBeans来构建项目。 我下面的简单测试会生成以下错误:
> run:
driver loaded
Exception in thread "main" java.lang.ExceptionInInitializerError
Connecting...
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.initDefaultMarks(UniJDBCProtocolU2Impl.java:1239)
at com.ibm.u2.jdbc.UniJDBCProtocolU2Impl.<init>(UniJDBCProtocolU2Impl.java:116)
at com.ibm.u2.jdbc.UniJDBCConnectionImpl.<init>(UniJDBCConnectionImpl.java:137)
at com.ibm.u2.jdbc.UniJDBCDriver.connect(UniJDBCDriver.java:111)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at testjdbc.Main.main(Main.java:36)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 3
at asjava.uniclientlibs.UniTokens.<clinit>(UniTokens.java:109)
... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
我的测试代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package testjdbc;
import java.sql.*;
import java.io.*;
/**
*
* @author norm
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Connection con = null ;
try{
// generate URL
String url = "jdbc:ibm-u2://my.uv.db:31438/DB-ACCOUNT;user=me;password=pass"; //testing, I remove user and password from here and use them below. Still FAILS!!! ARGGGG!!!
String user = "me";
String password = "pass";
String driver = "com.ibm.u2.jdbc.UniJDBCDriver";
//Load driver and connect to server
Class.forName(driver);
System.out.println("driver loaded");
System.out.println("Connecting...");
con = DriverManager.getConnection(url); //This is line 36
// con = DriverManager.getConnection(url, user, password); // gives the same error
//con = DriverManager.getConnection("jdbc:ibm-u2://my.uv.db:31438/D:/PathTo/DB;" ); //and yet the same error for this as well
System.out.println("Connection String sent");
System.out.println("Querying...");
testQuery( con ) ;
}
catch ( SQLException e ) {
System.out.println("Ex-Message :" + e.getMessage());
System.out.println("Ex-Code :" + e.getErrorCode()) ;
System.out.println("Ex-SQLState:" + e.getSQLState());
System.out.println("Ex-Next :" + e.getNextException());
e.printStackTrace() ;
System.gc();
} catch ( Exception e) {
System.out.println("Exception caught:"+e) ;
e.printStackTrace() ;
}
}
public static void testQuery(Connection con)
throws SQLException
{
Statement stmt = con.createStatement();
String sql = "select FIRST.NAME from EMPCEL";
//"select @ID, CITY, STATE, ZIP, PHONE from CUSTOMER";
// Execute the SELECT statement
ResultSet rs = stmt.executeQuery(sql);
// Get result of first five records
System.out.println("\tlist selected columns for the first five records:");
int i = 1;
while (rs.next() && i < 6)
{
System.out.println("\nRecord "+ i +" :");
System.out.println("\tFirst Name : \t" + rs.getString(1));
// System.out.println("\tCITY :\t" + rs.getString(2));
// System.out.println("\tSTATE :\t" + rs.getString(3));
// System.out.println("\tZIP : \t" + rs.getString(4));
// System.out.println("\tPHONE :\t" + rs.getString(5));
i++;
System.out.println("Finished.");
}
rs.close();
stmt.close() ;
System.out.println("\n\t*--- QUERY test is done successful ---*\n");
}
}
这似乎与Netbeans有关。 在他们的论坛上另请参阅此主题 。 它似乎可以在Eclipse(可能还有所有其他环境)中工作。
这显然是UniVerse JDBC驱动程序中的错误。 显然,它是在静态初始化程序内部依赖于某些特定的环境条件,这在Netbeans中是不同的。 如果不是错误,那就抛出了一个不言自明的异常,而不是一个愚蠢的运行时异常。
我会将此错误报告给IBM / UniVerse。
如果提供的代码实际上是导致异常的代码,那么我猜它会失败,因为在您尝试获得连接时url
为null
。
但是错误stacktrace在第36行(注释行)显示了错误。 因此,如果我的猜测是错误的,请编辑您的问题,并提供匹配的代码和错误消息,并标记引发异常的代码行。
你并不孤单: 同样的问题
我也遇到了这个问题。 UniTokens假定字节到char的一对一转换,但并非所有平台都适用。 将参数传递给JVM可以避免此问题。 尝试-Dfile.encoding =“ windows-1252”或-Dfile.encoding =“ US-ASCII”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.