Tableau index outofbounds

bonjour
l’utilisateur entre différent taille de tableau veut dire tableau 1=2 et tableau2 = 3
en exécutant mon prg j’ai erreur suivante

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 2
at Testing4.main(Testing4.java:31)

veuillez m’aider svp
voilà mon prg:


import java.util.Scanner;
public class Testing4 
{
  public static void main(String[] args) 
  {
	Scanner sc=new Scanner(System.in);
	System.out.println("**Entrez nb d'élément de premier tableau:***");
	int m=sc.nextInt();
	int tab1[]=new int[m];
	
	
	System.out.println("**Entrez nb d'élément de deuxième tableau:***");
	int n=sc.nextInt();
	int tab2[]=new int[n];
	
	for(int i=0;i<tab1.length;i++)
	{
		System.out.println("*Entrez l'élément tableau 1 * n°"+(i+1)+""+" du tableau:");
		tab1[i]=sc.nextInt();
	}
	
	for(int i=0;i<tab2.length;i++)
	{
		System.out.println("*Entrez l'élément tableau 2 * n°"+(i+1)+""+" du tableau:");
		tab2[i]=sc.nextInt();
	}
	int tab3[]=new int [Math.max(m, n)];
	
	for(int i=0;i<tab3.length;i++)
    {
 	   tab3[i]=tab1[i]+tab2[i];
 	   System.out.println("L'addtion de chaque élément de ces 2 tableaux sont: "+tab1[i]+"+"+tab2[i]+" = "+tab3[i]);
    }
  }
 }



tu ne peux pas additionner le troisième élément du tableau 1 puisque le tableau 1 ne comporte que 2 éléments.
[i]tab3[i]=tab1[i]+tab2;

il faut que tu rajoutes une condition de controle pour arrêter la somme quand tu atteint le dernier élément du tableau qui comporte le moins d’éléments.

Plutôt que de modifier la condition de continuation (i<tab1.length && i<tab2.length && i<tab3.length au lieu de i<tab3.length), il est mieux de bien dimensionner tab3 dès le moment de sa création.

Avec Math.max la taille de tab3 est la taille du plus grand tableau, donc forcément si les deux tableaux n’ont pas la même taille ça dépasse.

Au lieu d’utiliser Math.max il faut utiliser Math.min : int tab3[]= new int [Math.min(m, n)];

Comme ça tab3 fait la même taille que le plus petit des deux tableaux tab1 et tab2, donc la dernière boucle ne devrait plus planter. Et ça évite d’avoir des 0 inutiles quand tu parcours tab3.
Edité le 21/06/2015 à 22:55

j’ai résolu mon pb ainsi:


import java.util.Scanner;
public class Testing3 
{	
  public static void main(String[] args) 
  {
    Scanner sc=new Scanner(System.in);
    System.out.println("*****Entrez nb d'élément de premier tableau:*****");
    int m=sc.nextInt();
	 
    System.out.println("*****Entrez nb d'élément de deuxième tableau:*****");
    int n=sc.nextInt();
	 
    int p = Math.max(m, n);
    int tab1[]=new int[p];
    int tab2[]=new int[p];
    int tab3[]=new int[p];
	 
    for(int i=0;i<n;i++)
    {
      System.out.println("*Entrez l'élément tableau 1 * n°"+(i+1)+""+" du tableau:");
      tab1[i]=sc.nextInt();
    }
	 
    for(int i=0;i<m;i++)
    {
       System.out.println("*Entrez l'élément tableau 2 * n°"+(i+1)+""+" du tableau:");
       tab2[i]=sc.nextInt();
    }
	 
    for(int i=0;i<p;i++)
    {
    tab3[i]=tab1[i]+tab2[i];
    System.out.println("L'addtion de chaque élément de ces 2 tableaux sont: "+tab1[i]+"+"+tab2[i]+" = "+tab3[i]);
    }
  }
}
import java.util.Scanner;
public class Testing3 
{	
  public static void main(String[] args) 
  {
    Scanner sc=new Scanner(System.in);
    System.out.println("*****Entrez nb d'élément de premier tableau:*****");
    int m=sc.nextInt();
	 
    System.out.println("*****Entrez nb d'élément de deuxième tableau:*****");
    int n=sc.nextInt();
	 
    int p = Math.max(m, n);
    int tab1[]=new int[p];
    int tab2[]=new int[p];
    int tab3[]=new int[p];
	 
    for(int i=0;i<n;i++)
    {
      System.out.println("*Entrez l'élément tableau 1 * n°"+(i+1)+""+" du tableau:");
      tab1[i]=sc.nextInt();
    }
	 
    for(int i=0;i<m;i++)
    {
       System.out.println("*Entrez l'élément tableau 2 * n°"+(i+1)+""+" du tableau:");
       tab2[i]=sc.nextInt();
    }
	 
    for(int i=0;i<p;i++)
    {
    tab3[i]=tab1[i]+tab2[i];
    System.out.println("L'addtion de chaque élément de ces 2 tableaux sont: "+tab1[i]+"+"+tab2[i]+" = "+tab3[i]);
    }
  }
}

merci d’avance