Почему я получаю ArrayIndexOutOfBoundsException в моем соединении JDBC? - PullRequest
1 голос
/ 27 августа 2010

Я новичок в 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");
}

}

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Это похоже на Netbeans. Смотрите также эту тему на их форуме. Похоже, что он работает в Eclipse (и, возможно, во всех других средах).

Это явно ошибка в драйвере JDBC UniVerse. По-видимому, он находится внутри статического инициализатора, полагаясь на некоторые специфические условия среды, которые отличаются в Netbeans. Если бы это не было ошибкой, это вызвало бы намного более понятное исключение, а не такое глупое исключение времени выполнения.

Я бы сообщил об этой ошибке в IBM / UniVerse.

1 голос
/ 27 августа 2010

Если представленный код является тем, который фактически вызвал исключение, то, я полагаю, это не удастся, потому что url равно null во время попытки установить соединение.

Но ошибка трассировки стека показывает ошибку в строке 36, которая является строкой комментария. Поэтому, если мое предположение неверно, отредактируйте свой вопрос и представьте соответствующий код и сообщение об ошибке и отметьте строку кода, которая выдает исключение.


Вы не одиноки: та же проблема

0 голосов
/ 12 ноября 2010

Я тоже столкнулся с этой проблемой. UniTokens предполагает, что преобразование байтов в символы выполняется один к одному, но это не так для всех платформ. Передача аргумента в JVM позволяет избежать этой проблемы. Попробуйте -Dfile.encoding = "windows-1252" или -Dfile.encoding = "US-ASCII"

...