2010-08-27 22 views
1

Je suis nouveau sur Java et j'essaie d'utiliser JDBC pour me connecter à une base de données UniVerse. J'utilise Sun Java 6 JDK pour utiliser NetBeans pour construire le projet. Mon test simple ci-dessous construit mais il donne les erreurs ci-dessous:Pourquoi ai-je une exception ArrayIndexOutOfBoundsException dans ma connexion JDBC?

> 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 d'essai:

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

} 
+0

Comme vous pouvez le voir, j'ai essayé le DriverManager.getConnection de différentes façons, y compris certaines qui ne sont pas reflétées dans ce itération. – Norm

Répondre

2

Cela semble être lié Netbeans. Voir aussi this topic sur leur forum. Il semble fonctionner dans Eclipse (et éventuellement dans tous les autres environnements).

Ceci est clairement un bug dans le pilote UniVerse JDBC. Il est apparemment à l'intérieur de l'initialiseur statique reposant sur une condition environnementale spécifique, ce qui est différent dans Netbeans. Si ce n'était pas un bug, cela aurait provoqué une exception beaucoup plus explicite, pas une exception d'exécution idiote.

Je signalerais ce bogue à IBM/UniVerse.

+1

SAINT CRAP !!! C'était ça. Et de penser que je me cognais la tête contre le bureau toute la journée d'hier. Je vais être au téléphone avec Rocket à ce sujet. Merci BalusC !! Et merci Stackoverflow. Je suppose que cela règle le débat sur l'IDE que j'utiliserai. – Norm

+0

De rien. – BalusC

1

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 la pile stack d'erreur affiche une erreur à la ligne 36 qui est une ligne de commentaire. Donc, si ma supposition est fausse, s'il vous plaît modifier votre question et présenter le code correspondant et le message d'erreur et marquer la ligne de code qui jette l'exception.


Vous n'êtes pas seul: same problem

+0

J'ai édité le code pour expliquer davantage ce que j'ai essayé sur les différentes lignes. Merci pour la réponse. J'ai également utilisé l'adresse IP ainsi que le nom de domaine. Toujours pas de résultat. – Norm

0

J'ai également rencontré ce problème. UniTokens suppose qu'il y a une conversion un-à-un d'octets en caractères, mais ce n'est pas vrai pour toutes les plates-formes. Passer un argument à la machine virtuelle Java évite ce problème. Essayez -Dfile.encoding = "windows-1252" ou -Dfile.encoding = "US-ASCII"