You need to sign in to do that
Don't have an account?
Batch APEX, Attempt to de-reference a null object error?
Hi All,
I am trying to write my first APEX Batch script and failing miserable at it, this is what i have so far, but it keeps failing with the error "Attempt to de-reference a null object" which i am a little confused about as the only comparison i have to null is on the SOQL query, which i have tested and works fine in isolation.
Here is the code, woudl really appreciate some pointers.
I am exectuting manually using:
mileage_bulk b = new mileage_bulk();
database.executeBatch((b), 10);
And the class is as follows:
global class mileage_bulk implements Database.Batchable<sObject>,
Database.AllowsCallouts
{
global Database.QueryLocator start(Database.BatchableContext BC)
{
String query = 'SELECT Id,Name,Amount,R2_Job_Ref__c,R2_Shipping_Post_Code__c FROM Opportunity WHERE R2_Shipping_Post_Code__c != null';
return Database.getQueryLocator(query);
}
global void execute(Database.BatchableContext BC, List<Opportunity> scope)
{
system.debug(scope);
for(Opportunity a : scope)
{
String startPostcode = null;
String endPostcode = a.R2_Shipping_Post_Code__c;
Pattern nonWordChar = Pattern.compile('[^\\w]');
endPostcode = nonWordChar.matcher(endPostcode).replaceAll('');
String endPostcodeEncoded = EncodingUtil.urlEncode(endPostcode, 'UTF-8');
Double totalDistanceMeter = null;
Integer totalDistanceMile = null;
String responseBody = null;
Boolean firstRecord = false;
String ukPrefix = 'UKH';
if ((a.R2_Job_Ref__c).toLowerCase().contains(ukPrefix.toLowerCase())){
startPostcode = EncodingUtil.urlEncode('HP27DU', 'UTF-8');
} else {
startPostcode = EncodingUtil.urlEncode('B604AD', 'UTF-8');
}
// build callout
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('http://maps.googleapis.com/maps/api/directions/json?origin='+startPostcode+'&destination='+endPostcodeEncoded+'&units=imperial&sensor=false');
req.setMethod('GET');
req.setTimeout(60000);
try{
// callout
HttpResponse res = h.send(req);
// parse coordinates from response
JSONParser parser = JSON.createParser(res.getBody());
responseBody = res.getBody();
//system.debug(responseBody);
while (parser.nextToken() != null) {
if ((parser.getCurrentToken() == JSONToken.FIELD_NAME) &&
(parser.getText() == 'distance')){
parser.nextToken(); // object start
while (parser.nextToken() != JSONToken.END_OBJECT){
String txt = parser.getText();
parser.nextToken();
//system.debug(parser.nextToken());
//system.debug(txt);
if (firstRecord == false){
//if (txt == 'text'){
//totalDistanceMile = parser.getText();
//system.debug(parser.getText());
//}
if (txt == 'value'){
totalDistanceMeter = parser.getDoubleValue();
double inches = totalDistanceMeter*39.3701;
totalDistanceMile = (integer)inches/63360;
system.debug(parser.getText());
firstRecord = true;
}
}
}
}
}
// update coordinates if we get back
if (totalDistanceMile != null){
//a.DistanceM__c = totalDistanceMile;
//a.Shipping_Postcode_2__c = a.R2_Shipping_Post_Code__c;
//a.Location__Longitude__s = lon;
//update a;
}
} catch (Exception e) {
}
//system.debug(accountId);
system.debug(a);
system.debug(endPostcodeEncoded);
system.debug(totalDistanceMeter);
system.debug(totalDistanceMile);
}
}
global void finish(Database.BatchableContext BC)
{
}
}
Actually worked it our for myself, a mear minutes after posting, isn't that always the way:
I was setting a sub-string without checkig to see if it was null:
String endPostcode = a.R2_Shipping_Post_Code__c;
Stuck it in a null check and now all is fine :)
Cheers
Gareth