tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
1098
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ZeroM170 ZeroM170 ist offline Grünschnabel
    Registriert seit
    Oct 2008
    Beiträge
    3
    Hallo!

    Ich bin ein Neuling in Sachen Java und habe ein Problem mit Exception Handling.
    Wir sollen ein Programm zur Matrizenmultiplikation schreiben. Durch Exception Handling soll nun geprüft werden, ob die die Zahl der Spalten des linken Operanden gleich der Zahl der Zeilen des rechten Operanden sind. Ich habe dieses Problem erstmal in einer if-Schleife gelöst, wie ich es aus C gewohnt bin, aber ich habe keine Ahnung wie das mit Exception Handling geht.
    Hier mal mein Quellcode von der Matrix Klasse ( Eingabe, Ausgabe und Berechnungsmethode):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    import java.io.BufferedReader;
     
    public class Matrix {
        public double[][] data;
     
        public Matrix(int m, int n) 
        {
            data = new double[m][n]; // m Zeilen ; n Spalten;
        }
        public void einlesen(BufferedReader din) throws java.io.IOException {
            for (int i = 0; i < data.length; i++)
                for (int j = 0; j < data[0].length; j++) {
                    System.out.print("( " + (i + 1) + ", " + (j + 1) + " ) : ");
                    data[i][j] = Double.parseDouble(din.readLine());
                }
        }
     
        public void show() {
            for (int i = 0; i < data.length; i++) {
                for (int j = 0; j < data[0].length; j++)
                    System.out.printf(data[i][j] + "\t");
                System.out.println();
            }
        }
     
        public Matrix multiplizieren(Matrix b) // Matrix A * Matrix B
        {
            int p = data.length, q = b.data.length, r = b.data[0].length;
            Matrix c = new Matrix(p, r);
            for (int i = 0; i < p; i++)
                for (int j = 0; j < r; j++) {
                    double sum = 0.0;
                    for (int k = 0; k < q; k++)
                        sum += data[i][k] * b.data[k][j];
                    c.data[i][j] = sum;
                }
            return c;
        }
    }

    und die Klasse Test mit meiner Main:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
     
    public class test {
     
        public static void main(String[] argv) throws java.io.IOException
        {
            BufferedReader din = new BufferedReader(
                    new InputStreamReader(System.in));
                    System.out.println("Zeilenanzahl Matrix A  " + "eingeben :");
                    int p = Integer.parseInt(din.readLine());
                    System.out.println("Spaltenanzahl Matrix A  " + "eingeben :");
                    int q = Integer.parseInt(din.readLine());
                    System.out.println("Zeilenanzahl Matrix B  " + "eingeben :");
                    int r = Integer.parseInt(din.readLine());
                    System.out.println("Spaltenanzahl Matrix B  " + "eingeben :");
                    int s = Integer.parseInt(din.readLine());
                    Matrix a = new Matrix(p, q);
                    Matrix b = new Matrix(s, r);
     
                    if (s != q) // Abfrage ob Multiplikation möglich ist
                        System.out.println("Spaltenanzahl von Matrix A stimmt nicht mit der Zeilenanzahl von Matrix B überein");
                    else {
                        System.out.println("Matrix A eingeben :");
                        a.einlesen(din);
     
                        System.out.println("Matrix B eingeben :");
                        b.einlesen(din);
     
                        Matrix c = a.multiplizieren(b);
                        System.out.println("Ergebnismatrix " + "C = A * B :");
                        c.show();
                    }
                }
     
                }

    Muss ich jetzt meine Exceptions in der Test Klasse erstellen oder in meiner Methode multiplizieren bzw wie muss meine eigene Exception Klasse aussehen
    Danke im voraus
    ZeroM170
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Wenn die Zeilen- und Spaltenzahlen nicht übereinstimmen würdest du eine ArrayIndexOutOfBoundsException bekommen. Ich weiß nicht genau was die Aufgabenstellung ist und was du da nun selber noch mit Exceptions tun sollst...
     

  3. #3
    ZeroM170 ZeroM170 ist offline Grünschnabel
    Registriert seit
    Oct 2008
    Beiträge
    3
    Danke für die schnelle Antwort.
    Mein Hauptproblem liegt darin, dass ich nicht weiß wo ich diesen Try und Catch Block plazieren muss.
    Muss das in die Methode multiplizieren oder muss das ins main Programm, wo ich den Fehler erstmal provisorisch mit der If-Schleife abgefangen habe?
    MfG ZeroM170
     

  4. #4
    CKingZesi CKingZesi ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    62
    Hallo,

    Grundsätzlich muss der try-catch Block um den Programmblock herum gelegt werden, der den Fehler verursacht, dort wird dann auch der Fehler abgefangen wenn er auftritt. Die Exception wird hingegen dort geworfen wo der Fehler effektiv auftritt...

    Also in deinem Fall muss beim Aufruf fürs multiplizieren der try-catch Block eingefügt werden, während beim multiplizieren selbst überprüft werden muss ob die Multiplikation überhaupt möglich ist. Ist sie nicht möglich, wirfst du dort eine Exception.

    Also zum Beispiel so:

    Deine erweiterte Matrix Klasse
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    import java.io.BufferedReader;
     
    public class Matrix
    {
        public double[][] data;
        private int rows;
        private int columns;
     
        public Matrix(int m, int n)
        {
            this.rows = m;
            this.columns = n;
            data = new double[m][n]; // m Zeilen ; n Spalten;
        }
        
        public void einlesen(BufferedReader din) throws java.io.IOException
        {
            for (int i = 0; i < data.length; i++)
                for (int j = 0; j < data[0].length; j++) {
                    System.out.print("( " + (i + 1) + ", " + (j + 1) + " ) : ");
                    data[i][j] = Double.parseDouble(din.readLine());
                }
        }
     
        public void show()
        {
            for (int i = 0; i < data.length; i++) {
                for (int j = 0; j < data[0].length; j++)
                    System.out.printf(data[i][j] + "\t");
                System.out.println();
            }
        }
     
        public Matrix multiplizieren(Matrix b) // Matrix A * Matrix B
        {
                    //Überprüfen ob Multiplikation möglich, wenn nicht: Exception werfen
            if(b.getRows() != this.columns)
              throw new IndexOutOfBoundsException();
     
            int p = data.length, q = b.data.length, r = b.data[0].length;
            Matrix c = new Matrix(p, r);
            for (int i = 0; i < p; i++)
                for (int j = 0; j < r; j++) {
                    double sum = 0.0;
                    for (int k = 0; k < q; k++)
                        sum += data[i][k] * b.data[k][j];
                    c.data[i][j] = sum;
                }
            return c;
        }
     
        public int getRows()
        {
            return this.rows;
        }
    }

    Deine Test-Klasse
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
     
    public class Test
    {
        public static void main(String[] args) throws java.io.IOException
        {
            BufferedReader din = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Zeilenanzahl Matrix A  " + "eingeben :");
            int p = Integer.parseInt(din.readLine());
            System.out.println("Spaltenanzahl Matrix A  " + "eingeben :");
            int q = Integer.parseInt(din.readLine());
            System.out.println("Zeilenanzahl Matrix B  " + "eingeben :");
            int r = Integer.parseInt(din.readLine());
            System.out.println("Spaltenanzahl Matrix B  " + "eingeben :");
            int s = Integer.parseInt(din.readLine());
            Matrix a = new Matrix(p, q);
            Matrix b = new Matrix(s, r);
     
            System.out.println("Matrix A eingeben :");
            a.einlesen(din);
     
            System.out.println("Matrix B eingeben :");
            b.einlesen(din);
     
                    //Exception hier abgfangen
            try
            {
              Matrix c = a.multiplizieren(b);
              System.out.println("Ergebnismatrix " + "C = A * B :");
              c.show();
            }
            catch(IndexOutOfBoundsException e)
            {
                System.out.println("Spaltenanzahl von Matrix A stimmt nicht mit der Zeilenanzahl von Matrix B überein");
            }
        }
    }

    Also eventuell musst du den Code noch überprüfen, aber vielleicht siehst du jetzt ein bisschen das Konzept...

    Freundliche Grüsse
     
    Eine Frage braucht keinen Anlass, die Frage ist der Anlass selbst...

  5. #5
    CKingZesi CKingZesi ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    62
    Nochmals ich...

    Noch besser wäre natürlich wenn die Exception geworfen und abgefangen wird, bevor der Benutzer die ganze Sache eingeben muss... Das wäre programmtechnisch sicher sinnvoller... Aber ich denke du kriegst das nun sicher auch alleine hin...

    Freundliche Grüsse
    CKingZesi
     
    Eine Frage braucht keinen Anlass, die Frage ist der Anlass selbst...

  6. #6
    ZeroM170 ZeroM170 ist offline Grünschnabel
    Registriert seit
    Oct 2008
    Beiträge
    3
    Vielen herzlichen Dank, jetzt versteh ichs......
     

  7. #7
    Avatar von tim staeglich
    tim staeglich tim staeglich ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    84
    Hi, kleine Anregung:

    für ein sinnvolles Logging bzw. Exception handling überhaupt kannst Du auch Exceptions unterdrücken, weiterleiten etc..

    D.h. wenn ein Programmblock den Fehler verursacht, würde es evtl. mehr nützen
    die Exception für die ganze Methode zu werfen (z.B. try{}catch{} um den ganzen Block,
    mit der Message "Method A() throws MyException...").

    In so einem Fall muss das Programm nicht stoppen etc., sondern es gibt eine gezielte Nachrichtenübermittlung über Exceptions.

    Grüße, Tim
     
    XING -- Hat Dir mein Beitrag geholfen? Dann würde ich mich über eine positive Bewertung freuen!

Ähnliche Themen

  1. PHP 5 Exception Handling
    Von Quadaptor im Forum PHP
    Antworten: 5
    Letzter Beitrag: 31.10.09, 10:22
  2. Exception Handling in C#
    Von mafin im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 26.01.09, 22:11
  3. Email Exception Handling
    Von Tekkion im Forum Visual Basic 6.0
    Antworten: 7
    Letzter Beitrag: 29.05.08, 08:22
  4. Exception-Handling
    Von naeko im Forum Java
    Antworten: 3
    Letzter Beitrag: 19.04.07, 23:06
  5. exception handling in c++
    Von ciMbOmFrEaK im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 17.03.03, 17:49