2016-04-13 23 views
2

jre-1.8_66 üzerinde çalışırken JTDS'de garip bir ArrayIndexOutOfBoundsException ile karşılaştık ve web üzerinde bu sorunun başka bir sözünü bulamadık.jtds ArrayIndexOutOfBoundsException on Jre 1.8.66

Sunucu jvmdll kullanılırken jre-1.8_66'nın 32 bit sürümünü çalıştırırken hem jtds 1.2.5 ve 1.2.8'i kullanarak bu hatayı yineledim. 64-bit JRE veya 32-bit istemci jvm.dll kullanırken hata çoğaltamıyorum.

Ayrıca, Eclipse'de çalışırken veya Eclipse'den uzaktan hata ayıklama çalışırken bu hatayı yineleyemiyorum, bu nedenle sorunun belirli nedenini daraltamam.

Tam yığın izi aşağıdadır. durum oluşur ve ben özellikle yanlış bir şey göremiyorum ama kolayca karıştırılabilen nerede

java.lang.ArrayIndexOutOfBoundsException: 14 
    at net.sourceforge.jtds.jdbc.TdsData.readData(TdsData.java:800) 
    at net.sourceforge.jtds.jdbc.TdsCore.tdsRowToken(TdsCore.java:3081) 
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2346) 
    at net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:777) 
    at net.sourceforge.jtds.jdbc.JtdsResultSet.next(JtdsResultSet.java:596) 
    at test.jtdstest.JtdsText.main(JtdsText.java:51) 

Ben noktada jtds kod ettik.

Hatayı çoğaltmak için yazdığım test programı aşağıda.

package test.jtdstest; 

import java.io.File; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.Properties; 

public class JtdsText 
{ 

    private static PrintWriter pw; 

    static 
    { 
     try 
     { 
     pw = new PrintWriter(new File("c:\\temp\\jtds_trace.txt")); 
     DriverManager.setLogWriter(pw); 
     Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
     } 
     catch (Exception localException) 
     { 
     } 
    } 

    public static void main(String[] args) 
    throws Exception 
    { 
    Connection conn = null; 
    PreparedStatement stmt = null; 
    ResultSet res = null; 
    try 
    { 
     String sql = 
      "SELECT " 
      + "text1, " 
      + "int1, " 
      + "int2, " 
      + "text2 " 
      + "FROM " 
      + "text_test"; 

     conn =  DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test;user=user1;password=aa"); 
     stmt = conn.prepareStatement(sql); 

     res = stmt.executeQuery(); 
     while (res.next()) 
     { 
      int int1 = res.getInt(2); 
      System.out.println("int1 = " + Integer.toString(int1)); 
     } 
    } 
    catch (Exception ex) 
    { 
     System.out.println("Error processing result set:"); 
     ex.printStackTrace(); 
     System.out.println(); 
    } 
    finally 
    { 
     try 
     { 
      if(res != null) 
      { 
      res.close(); 
      } 

      if(stmt != null) 
      { 
      stmt.close(); 
      } 

      if(conn != null) 
      { 
      conn.close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      System.out.println("Error cleaning up Statement:"); 
      ex.printStackTrace(); 
      System.out.println(); 
     } 
    } 
    } 
} 

I gerekirse de hata çoğaltmak için kullanılan veri sağlayabilir.

Bunun JRE dosyasında bir hata olduğunu şüpheliyim, çünkü bu, hatayı çoğaltabilen tek değişkendir.

Daha önce bunlarla karşılaşan var mı? JVM'yi değiştirmek dışında, hatayı aşmanın başka bir yolu var mı? Bu hatayı JVM'ye karşı rapor etmemi tercih edeyim mi?

cevap

2

Bu, JIT derleyicisindeki bir hatadır. -Xint seçeneğini kullanarak JIT derleyicisini kapatmak sorunu çözer. Bunu adreslemek için Oracle ile günlüğe kaydetme sürecindeyiz.

+0

Bunun için Oracle hata kimliğine bir bağlantınız olmalı mı? – Jason

İlgili konular