Somme de deux matrices... JAVA - exception java

Hello everybody !

voila j’ai crée une class matrix :

 import fr.jussieu.script.Deug;

class Matrix{
    int [][] m1;
    int[][] m2;
    
    public Matrix(int[][] a, int[][] b){
        m1=a;  m2=b;
    }

J’aimerais à présent écrire une fonction faisant la comme de deux matrices:

 

public int[][] somme(Matrix m){
        
        int[][] res=new int[m1.length][];
        
/* LES DEUX MATRICES DOIVENT ÊTRE DE MEME TYPE */
         for(int i=0; i<m1[i].length;i++){
       if(m1.length!=m2.length || m1[i].length!= m2[i].length) Deug.exit(); }
               
        for(int i=0;i<m1.length;i++){
            for(int j=0;j<this.m1[i].length;j++) res[i][j]=m1[i][j]+m2[i][j]; }
            return res;
       }

à la compil aucune erreur mais a l’exécution j’ai :

"java.lang.ArrayIndexOutOfBoundsException: 2
at matrix.Matrix.somme(Main.java:19)
at matrix.Main.main(Main.java:50)
Exception in thread "main"
Java Result: 1 " :frowning:

donc si qqun voit où est l’erreur :slight_smile:
Merci !

A priori ton modèle est mal fait :

public class Matrix {
  private final int[][] data;
  public Matrix(int[][] data) {
     this.data = data;
  }

  public Matrix sum(Matrix m) {
     if (m.data.length != data.length) {
       throw new IllegalArgumentException( 
         'Matrice de taille invalide pour la somme (reçue ' + 
         m.data.length + ', attendue: ' + data.length + ')');
     }
     int[][] p = new int[data.length][];
     for (int i = 0; i < data.length; ++i) {
       if (m.data[i].length != data[i].length) {
         throw new IllegalArgumentException( 
           'Ligne de taille invalide pour la somme (index: ' + i + ', reçue ' + 
           m.data[i].length + ', attendue: ' + data[i].length + ')');
       }
       p[i] = new int[data[i].length]; // sinon ne marche pas
       for (int j = 0; j < data[i].length; ++j) {
         p[i][j] = data[i][j] + m.data[i][j];
       }
     }
     return new Matrix(p);
  } 
}

Plusieurs trucs:

  1. On ne fait pas un exit en cas d’erreur, on jette une exception adhoc.
  2. Les matrices sont des éléments de taille n * m. A priori, tu peux stocker deux entiers pour indiquer la taille, ce afin d’éviter de faire le test dans la boucle.
  3. Quand tu as une exception, tu vas sur la javadoc histoire de savoir à quoi elle correspond :

http://java.sun.com/javase/6/docs/api/java…sException.html

En gros, tu fais a[654656] alors que la taille de a c’est mettons 2 : il peut pas accéder à l’index donné, logique.

Voilà.

oks! Merci bcp ! :slight_smile:

je ne connaissais pas le "throw new…" , je me suis documenter, merci !

throw, try, catch, finally. C’est le mécanisme d’exception de java tout simplement;

et throws avec un S sur une méthode, pour remonter l’exception au niveau supérieur :wink: