function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
RaúlRaúl 

Execution of BeforeInsert caused by: System.NullPointerException: Attempt to de-reference a null object Class.Battle

I would like to create a trigger to activate when using the Battle class and its battle percentage method, but it gives me a "activate percentage: execution of BeforeInsert caused by: System.NullPointerException: Attempt to de-reference a null object Class.Battle. Battle percentage: line 5, column 1 Trigger. Activate percentage: line 4, column 1 "What could be the solution? thank you
My class:
 
public class Batalla {

public List<Batalla__c> porcentajebatalla(Map<Id, Batalla__c> batallas) {
       //List<Batalla__c> ListBattle = [SELECT Id,Oponente2__c, Poder_ejercito1__c, Puntos_poder_ejercito2__c, Porcentaje_batalla__c FROM Batalla__c];
       List<Batalla__c> ListBattle = batallas.values();
       
    
       Double high = 0.0;
       Double high2 = 0.0;
       Double low = 0.0;
       Double low2 = 0.0;
       Double combatP1 = 0.0;
       Double combatP2 = 0.0;
      // Double resultBattle = 0.0;
       Double result = 0.0;
       Double result2 = 0.0;
       Integer QuerySize = ListBattle.size();
       System.debug('QuerySize = ' + QuerySize);
       if(QuerySize > 0 ) {
          for(Batalla__c battle : ListBattle){
               combatP1 = battle.Poder_ejercito1__c;
               System.debug('combatP1 = ' + combatP1);
               combatP2 = battle.Puntos_poder_ejercito2__c;
               System.debug('combatP2 = ' + combatP2);
               high = combatP1 * 0.4;
                low = combatP1  * 0.2;
               high2 = combatP2 * 0.4;
                low2 = combatP2  * 0.2;
               System.debug('high = ' + combatP1 * 0.4);
                System.debug('low = ' + combatP1  * 0.2);
               System.debug('high2 = ' + combatP2 * 0.4);
                 System.debug('low2 = ' + combatP2  * 0.2);
               result = (math.random() * (high-low) + low);
              result2 = (math.random() * (high2-low2) + low2);
               battle.Porcentaje_batalla__c = result;
              battle.Porcentaje_2__c = result2;
               /*System.debug('battle.Porcentaje_batalla__c = ' + battle.Porcentaje_batalla__c);
                resultBattle = combatP2 - result;
               System.debug('resultBattle = ' + resultBattle);*/
                System.debug('result = ' + result);
              System.debug('result2 = ' + result2);
           }
       }
         upsert ListBattle;
       return ListBattle;
   }  


}

And my trigger is:
 
trigger activarporcentaje on Batalla__c (before insert) {
	
   Batalla bata = new Batalla();
   bata.porcentajebatalla(Trigger.newMap);
    
}

 
Best Answer chosen by Raúl
Vijay NirateVijay Nirate
please comment upsert statement it is actually not useful i.e. upsert ListBattle;

Use below code : 

public class Batalla {

public List<Batalla__c> porcentajebatalla(List<Batalla__c> batallas) {
       //List<Batalla__c> ListBattle = [SELECT Id,Oponente2__c, Poder_ejercito1__c, Puntos_poder_ejercito2__c, Porcentaje_batalla__c FROM Batalla__c];
       List<Batalla__c> ListBattle = batallas;
       
    
       Double high = 0.0;
       Double high2 = 0.0;
       Double low = 0.0;
       Double low2 = 0.0;
       Double combatP1 = 0.0;
       Double combatP2 = 0.0;
      // Double resultBattle = 0.0;
       Double result = 0.0;
       Double result2 = 0.0;
       Integer QuerySize = ListBattle.size();
       System.debug('QuerySize = ' + QuerySize);
       if(QuerySize > 0 ) {
          for(Batalla__c battle : ListBattle){
               combatP1 = battle.Poder_ejercito1__c;
               System.debug('combatP1 = ' + combatP1);
               combatP2 = battle.Puntos_poder_ejercito2__c;
               System.debug('combatP2 = ' + combatP2);
               high = combatP1 * 0.4;
                low = combatP1  * 0.2;
               high2 = combatP2 * 0.4;
                low2 = combatP2  * 0.2;
               System.debug('high = ' + combatP1 * 0.4);
                System.debug('low = ' + combatP1  * 0.2);
               System.debug('high2 = ' + combatP2 * 0.4);
                 System.debug('low2 = ' + combatP2  * 0.2);
               result = (math.random() * (high-low) + low);
              result2 = (math.random() * (high2-low2) + low2);
               battle.Porcentaje_batalla__c = result;
              battle.Porcentaje_2__c = result2;
               /*System.debug('battle.Porcentaje_batalla__c = ' + battle.Porcentaje_batalla__c);
                resultBattle = combatP2 - result;
               System.debug('resultBattle = ' + resultBattle);*/
                System.debug('result = ' + result);
              System.debug('result2 = ' + result2);
           }
       }
         //upsert ListBattle;
       return ListBattle;
   }  


}

All Answers

Vijay NirateVijay Nirate
Trigger.newMap will not be availabe in before insert event.
Vijay NirateVijay Nirate
Use below Code : 

Apex Class : 

public class Batalla {

public List<Batalla__c> porcentajebatalla(List<Batalla__c> batallas) {
       //List<Batalla__c> ListBattle = [SELECT Id,Oponente2__c, Poder_ejercito1__c, Puntos_poder_ejercito2__c, Porcentaje_batalla__c FROM Batalla__c];
       List<Batalla__c> ListBattle = batallas;
       
    
       Double high = 0.0;
       Double high2 = 0.0;
       Double low = 0.0;
       Double low2 = 0.0;
       Double combatP1 = 0.0;
       Double combatP2 = 0.0;
      // Double resultBattle = 0.0;
       Double result = 0.0;
       Double result2 = 0.0;
       Integer QuerySize = ListBattle.size();
       System.debug('QuerySize = ' + QuerySize);
       if(QuerySize > 0 ) {
          for(Batalla__c battle : ListBattle){
               combatP1 = battle.Poder_ejercito1__c;
               System.debug('combatP1 = ' + combatP1);
               combatP2 = battle.Puntos_poder_ejercito2__c;
               System.debug('combatP2 = ' + combatP2);
               high = combatP1 * 0.4;
                low = combatP1  * 0.2;
               high2 = combatP2 * 0.4;
                low2 = combatP2  * 0.2;
               System.debug('high = ' + combatP1 * 0.4);
                System.debug('low = ' + combatP1  * 0.2);
               System.debug('high2 = ' + combatP2 * 0.4);
                 System.debug('low2 = ' + combatP2  * 0.2);
               result = (math.random() * (high-low) + low);
              result2 = (math.random() * (high2-low2) + low2);
               battle.Porcentaje_batalla__c = result;
              battle.Porcentaje_2__c = result2;
               /*System.debug('battle.Porcentaje_batalla__c = ' + battle.Porcentaje_batalla__c);
                resultBattle = combatP2 - result;
               System.debug('resultBattle = ' + resultBattle);*/
                System.debug('result = ' + result);
              System.debug('result2 = ' + result2);
           }
       }
         upsert ListBattle;
       return ListBattle;
   }  


}


Apex Trigger : 

trigger activarporcentaje on Batalla__c (before insert) {
    
   Batalla bata = new Batalla();
   bata.porcentajebatalla(Trigger.new);
    
}
RaúlRaúl

284/5000
Thank you very much but keep giving the same error

"ctivar percentage: execution of BeforeInsert caused by: System.SObjectException: DML statement cannot operate on trigger.new or trigger.old Class.Battle.percentage battle: line 44, column 1 Trigger.activate percentage: line 4, column 1"
Vijay NirateVijay Nirate
please comment upsert statement it is actually not useful i.e. upsert ListBattle;

Use below code : 

public class Batalla {

public List<Batalla__c> porcentajebatalla(List<Batalla__c> batallas) {
       //List<Batalla__c> ListBattle = [SELECT Id,Oponente2__c, Poder_ejercito1__c, Puntos_poder_ejercito2__c, Porcentaje_batalla__c FROM Batalla__c];
       List<Batalla__c> ListBattle = batallas;
       
    
       Double high = 0.0;
       Double high2 = 0.0;
       Double low = 0.0;
       Double low2 = 0.0;
       Double combatP1 = 0.0;
       Double combatP2 = 0.0;
      // Double resultBattle = 0.0;
       Double result = 0.0;
       Double result2 = 0.0;
       Integer QuerySize = ListBattle.size();
       System.debug('QuerySize = ' + QuerySize);
       if(QuerySize > 0 ) {
          for(Batalla__c battle : ListBattle){
               combatP1 = battle.Poder_ejercito1__c;
               System.debug('combatP1 = ' + combatP1);
               combatP2 = battle.Puntos_poder_ejercito2__c;
               System.debug('combatP2 = ' + combatP2);
               high = combatP1 * 0.4;
                low = combatP1  * 0.2;
               high2 = combatP2 * 0.4;
                low2 = combatP2  * 0.2;
               System.debug('high = ' + combatP1 * 0.4);
                System.debug('low = ' + combatP1  * 0.2);
               System.debug('high2 = ' + combatP2 * 0.4);
                 System.debug('low2 = ' + combatP2  * 0.2);
               result = (math.random() * (high-low) + low);
              result2 = (math.random() * (high2-low2) + low2);
               battle.Porcentaje_batalla__c = result;
              battle.Porcentaje_2__c = result2;
               /*System.debug('battle.Porcentaje_batalla__c = ' + battle.Porcentaje_batalla__c);
                resultBattle = combatP2 - result;
               System.debug('resultBattle = ' + resultBattle);*/
                System.debug('result = ' + result);
              System.debug('result2 = ' + result2);
           }
       }
         //upsert ListBattle;
       return ListBattle;
   }  


}
This was selected as the best answer
RaúlRaúl
Thank you very much, now it works perfectly !!!