繁体   English   中英

ArrayIndex超出Java中的绑定异常

[英]ArrayIndex out of bound exception in java

我有一个jsp页面,通过该页面我可以从下拉菜单中选择一个具有数据时间格式的值,并从一个日历中选择数据和时间。当我提交此表单时,将调用另一个JSP页面,该页面调用用Java定义的方法类。 该方法具有以下代码

public  LinkedHashMap<Double, String> ClosestToMultiplesOfTen_User(String start,String end) throws SQLException {

int row_id ;
int bIdx = 0;
double[] vals=null;
int rowIndex = 0 ;
int i=0;

try
        { 
          con = getConnection();
          stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);     
   String sql="select distinct beam_current from INDUS2_BDS.dbo.DCCT where logtime between '"+start+"' and '"+end+"'"+
                  "and (beam_current like '%9.95' or beam_current like '%9.96' or beam_current like '%9.97' or beam_current like '%9.98' or  beam_current like '%9.99'  or beam_current like '%0' or beam_current like '%_0.01' or beam_current like '%_0.02' or beam_current like '%_0.03' or beam_current like '%_0.04' or beam_current like '%_0.05' or beam_current like '%_0.06') ";

         stmt.executeQuery(sql);
          rs = stmt.getResultSet();

         rs.last();
            int row_cnt=rs.getRow();
            System.out.println("row_count of closest " +row_cnt);
             vals = new double[row_cnt];
            rs.beforeFirst();
while(rs.next()) 
    {
   for(int j=0; j<1; j++)
         {
           vals[i]  = rs.getDouble(1);
         }
        i++;
     }
    }
 catch( Exception e )
    {
        System.out.println("\nException "+e);
    }


//  get the max value, and its multiple of ten to get the number of buckets
 double max = java.lang.Double.MIN_VALUE;
 for (double v : vals) max = Math.max(max, v);
Arrays.sort(vals);
System.out.println("value at vals[0] c "+vals[0]);
double min=vals[0];
int m2=(int) Math.round(min);
int m3=(int) Math.round(max);

int bucketCount = 1+((m3-m2)/10);
double[] bucket =new double[bucketCount];

 //  initialise the buckets array to store the closest values
double[][] buckets = new double[bucketCount][3];
for (int i1 = 0; i1 < bucketCount; i1++){
     // store the current smallest delta in the first element
     buckets[i1][0] = java.lang.Double.MAX_VALUE;
     // store the current "closest" index in the second element
     buckets[i1][1] = -1d;
     // store the current "closest" value in the third element
     buckets[i1][2] = java.lang.Double.MAX_VALUE;
 }

 //  iterate the rows
 for (row_id=1 ; row_id < vals.length; row_id++)
 {
     //  get the value from the row
     double v = vals[row_id];
     //  get the closest multiple of ten to v
     double mult = getMultipleOfTen(v);
     //  get the absolute distance of v from the multiple of ten
     double delta = Math.abs(mult - v);
     //  get the bucket index based on the value of `mult`
    bIdx = (int)(mult / 10d);
   // System.out.println("value of bidx for bucket index is"+bIdx);
     //    test the last known "smallest delta" for this bucket
     if (buckets[bIdx][0] > delta)
     {
      //  this is closer than the last known "smallest delta"
       buckets[bIdx][0] = delta;
       buckets[bIdx][1] = row_id;
       buckets[bIdx][2] = v;

     }
  }  
//   print out the result
for (int i1 =1; i1 < buckets.length; i1++)
{
      bucket = buckets[i1];
     rowIndex = (int) bucket[1];
 double rowValue = bucket[2];
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      System.out.println("row index closeset "+rowIndex+ "value is closest "+rowValue);
   rs.absolute(rowIndex+1);
      user_current_map.put(java.lang.Double.valueOf(twoDForm.format(rs.getDouble(1))),"");

     }
System.out.println("user_current_map "+user_current_map);

return user_current_map;
}

 public  double getMultipleOfTen(double v)
            {
                 System.out.println(10d * Math.round(v / 10d));
                return 10d * Math.round(v / 10d);
            }

检索到的bucketcount值正确。 但是我在java.lang.ArrayIndexOutOfBoundsException:21的 (buckets [bIdx] [0]> delta)处遇到异常。 21是从存储区计数中检索的值。我没有弄错,我要去哪里了?

我明白了, **bIdx = (int)(mult / 10d);** 值从m2 / 10值开始而不是从0开始 ,所以当它尝试访问大于存储桶大小的索引时等于存储桶数,发生数组索引超出范围的异常。

解决方案= bIdx = (int)(mult / 10d) - m2/10;

将其除以检索到的最小值/ 10,这样它将从0开始直到达到存储桶大小。

数组索引从0开始,一直到n-1。 在您的情况下,您可以从索引0访问元素,直到21-1 = 20。 因此,您应该使用:

 if (buckets[bIdx-1][0] > delta)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM