Pourquoi est-ce que je reçois un ArrayIndexOutOfBoundsException dans ma connexion JDBC?

StackOverflow https://stackoverflow.com/questions/3583182

  •  01-10-2019
  •  | 
  •  

Question

Je suis nouveau à Java et je tente d'utiliser JDBC pour se connecter à une base de données UniVerse. J'utilise Sun Java 6 JDK à utiliser NetBeans pour construire le projet. Mon test simple ci-dessous builds mais il donne les erreurs ci-dessous:

> 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)

Mon code de test:

/*
* 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");
}

}
Était-ce utile?

La solution

Cela semble être lié Netbeans. Voir aussi ce sujet à leur forum. Il semble travailler dans Eclipse (et peut-être tous les autres environnements).

Ceci est clairement un bogue dans le pilote JDBC UniVerse. Il est apparemment à l'intérieur du statique initialiseur reposant sur une condition environnementale spécifique, ce qui est différent dans Netbeans. Si ce n'était pas un bug, il aurait jeté une exception auto-expliquer plus beaucoup, pas une exception d'exécution stupide.

Je signaler ce bug à IBM / UniVerse.

Autres conseils

Si le code présenté est celui qui en fait a provoqué l'exception, je suppose, il échoue parce que url est null au moment où vous essayez d'obtenir la connexion.

Mais les STACKTRACE erreur affiche une erreur à la ligne 36, qui est la ligne de commentaire. Donc, si je pense est faux, s'il vous plaît modifier votre question et présente le code correspondant et le message d'erreur et marquer la ligne de code qui lève l'exception.


Vous n'êtes pas seul: même problème

j'ai vécu ce problème aussi. UniTokens suppose qu'il ya une conversion un pour l'un des octets à caractères, mais il est pas vrai pour toutes les plateformes. Le passage d'un argument à la machine virtuelle Java évite ce problème. Essayez -Dfile.encoding = "windows-1252" ou -Dfile.encoding = "US-ASCII"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top