2016-09-14 8 views
0

Эта ошибка возникает из метода подстроки, и я нашел много потоков, связанных с этой проблемой, но проблема, с которой я сталкиваюсь, по-видимому, отличается. Я понимаю, что она выкинет эту ошибку, если ваша строка короче, чем подстроки (начало, конец) размер, но эта ошибка возникает, прежде чем что-либо еще передается в вызов методаObscure 'StringIndexOutOfBoundsException "

Я бег критерия Спящего.

public static List<Object[]> baseQuery() throws HibernateException{ 
    Session session = getSession(); 
    Criteria criteria = session.createCriteria(CsvDataEntity.class); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.property("clearanceMainCat")); 
    projectionList.add(Projections.property("clearanceDt")); 
    projectionList.add(Projections.property("vertRadians")); 
    projectionList.add(Projections.property("latitude")); 
    criteria.setProjection(projectionList); 

    List<Object[]> list = criteria.list(); 
    return list; 
    } 

Тогда я м, используя запрос здесь:

List<Object[]> fullList = baseQuery(); 
    String address = "400 Pine St, Seattle, WA 98101"; 
    String distance = "1"; 
    String years = "8"; 

    //create 'context' for GoogleMaps GeoCode API, geocode user-defined address 
    GeoApiContext context = new GeoApiContext().setApiKey("Foobar"); 
    GeocodingResult[] result = geocode(context, address).await(); 
    Geometry coordinates = result[0].geometry; 

    //store user request lat & lng from address supplied from form 
    double longitude = coordinates.location.lng; 
    double latitude = coordinates.location.lat; 

    //user requested distance 
    double requestedDistanceInMiles = Double.parseDouble(distance); 

    //list to store all the crimes within the specified distance 
    List<CrimeModel> crimeList = new ArrayList<>(); 

    for (Object[] record : fullList) { 

     //verifying crime was commmitted within user-defined distance 
     Boolean withinDistance = false; 
     double rowLng = Double.parseDouble((String)record[2]); 
     double rowLat = Double.parseDouble((String)record[3]); 
     double milesBetween =  (haversineDistance(latitude,rowLat,longitude,rowLng,0,0))/1609.34; 

     if (milesBetween <= requestedDistanceInMiles) { 
      withinDistance = true; 
     } 

     //verifying crime was committed within user-defined time-range 
     Boolean withinTimeRange =false; 
     double requestedYears = Double.parseDouble(years); 
     long requestedDays = Math.round(requestedYears * 365); 
     String objectDate = (String) record[1]; 
     String recordDateAsString = objectDate.substring(0, 10); 

Запрос работает, и он возвращает строку даты + времени, которая, конечно, более десяти символов. Странно, я поставил точку останова в строке 4, отлаживался, запрос выполнялся нормально, но затем он выдает ошибку для пути вниз в нижней части отрывка, который я разместил там, где вызывается substring(). Другими словами, моя строка должна иметь необходимую длину, но даже до этой ошибки она не передается. Кто-нибудь знает, почему это было бы брошено, если оно даже не было выполнено? Я запускаю это в Spring MVC, это единственное, что я могу придумать, что может привести к какой-то странной ситуации. Благодарю.

+2

Пожалуйста, добавьте ваш стек. И помимо вашей проблемы с ошибкой: прочитайте о принципе ** одного слоя абстракции **. Ваш код может выиграть от этого. О, очень. – GhostCat

+0

Не могли бы вы вывести значения ** fullList **? –

+1

Пожалуйста, опубликуйте значение 'objectDate' –

ответ

1

Как @David Уоллес упомянул, поскольку база данных была такой большой, иногда отсутствовали записи и после того, как список был заполнен из запроса, ошибка была выбрана. Я проделал их просто, чтобы пропустить их (все четыре столбца из запроса необходимо обрабатывать из-за отсутствия записей), и все работает нормально.

  //skip null records in database 
      if (objectDate.length() < 10) { 
       continue; 
      } else { 
       recordDateAsString = objectDate.substring(0, 10); 
      }