Exception Handling Problem

ZeroM170

Grünschnabel
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:
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:
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
 
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...
 
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
 
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:
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:
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
 
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
 
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
 
Zurück