Methode aus einer Klasse aufrufen

Mensch_

Mitglied
Hallo wieder JAVA-Fans!
Es ist bisschen spät schon, aber ich bin sehr begeistert und probiere ein Programm zu erzeugen.
Meine Aufgabe ist:
1. Schreibt eine Klasse Bruch, die Brüche, also Paare von ganzzahligen Zählern und Nennern, darstellt.
2. Schreibt zunächst einen Konstruktor, der Zähler und Nenner übergeben bekommt.
3. Schreibt eine Objektmethode printBruch(), die den Bruch ausgibt. Im Nenner soll kein Vorzeichen
stehen (d. h. es soll z. B. statt 1/ − 2 −1/2 ausgegeben werden).
4. Erstellt eine Objektmethode addiereBruch(...), die einen übergebenen Bruch hinzu addiert.
5. Schreibt eine Objektmethode umkehrBruch(), die den Bruch umkehrt.
6. Implementiert eine andere (Test-)Klasse mit einer main-Methode, die Bruch-Objekte erstellt und
ausgibt, die anderen Methoden testet und die Ergebnisse ausgibt. Wählt Beispiele, die die Korrektheit
eurer Implementierung demonstrieren.
Hinweis: Beachtet Fälle mit 0 im Nenner – dies ist natürlich ungültig und muss angemessen behandelt
werden!

Meine Klasse mit den Methoden sieht so aus:

Java:
public class Bruch{
   int Zaehler;
   int Nenner;
	public void printBruch(){
	   if(Nenner != 0){
		if(Nenner < 0){
		Zaehler = -Zaehler;
		Nenner = -Nenner;
		}
		System.out.println(Zaehler+"/"+Nenner);
	    }else{ System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	    }
	    }
	public void addiereBruch(int z, int n){
		if(Nenner != 0){
		   if(Nenner == n){
		   Zaehler += z;
		   }else{
		      int multi = Nenner*n;
		      Zaehler = multi/Nenner;
		      z = multi/n;
		      Zaehler = Zaehler + z;
		      Nenner = multi; 
		   }
	        }else{ System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	        }
	}
 	 public void umkehrBruch(){
	   if(Nenner != 0 && Zaehler != 0){
	    int speicher = Zaehler;
	    Zaehler = Nenner;
	    Nenner = speicher;
	   }else{ System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	   }
         }
	   
 public Bruch(int Zaehler, int Nenner){
	this.Zaehler = Zaehler;
	this.Nenner = Nenner;
 }
}

Mein Test-Programm:

Java:
public class TestBruch{
   public static void main(String args[]){
   int zaehler = Terminal.askInt( "Der Zaehler von 1.Bruch ist: " );
   int nenner = Terminal.askInt( "Der Nenner von 1.Bruch ist: " );
 	Bruch Bruch1 = new Bruch( zaehler, nenner );
   char mehr = 'a';
    while ( true ){
      mehr = Terminal.askChar( "Möglichkeiten: \n Bruch auf dem Bildschirm zeigen: [b] \n Ein Bruch dazu addieren: [a] \n Den Bruch umkehren: [u] \n Das Programm beenden: [e] " );
      if ( mehr == 'b' ){
          Bruch1.printBruch();
      }
      if ( mehr == 'a' ){
          int z = Terminal.askInt( "Der Zaehler von 2.Bruch ist: " );
          int n = Terminal.askInt( "Der Nenner von 2.Bruch ist: " );
          Bruch Addition = new Bruch( zaehler, nenner );
	  Bruch.addiereBruch(z, n);
          Addition.printBruch();
	  }   
       if ( mehr == 'u' ){ 
	  Bruch umBruch = Bruch1;
	  umBruch.printBruch(); 
          }
       if ( mehr == 'e' ){
	  break;
       }
     }
    }
}

Ich denke, dass fast alles richtig ist, aber ich bekomme einen Fehler, wenn ich das Programm kompilieren möchte und nämlich:
TestBruch.java:16: error: non-static method addiereBruch(int,int) cannot be referenced from a static context
Bruch.addiereBruch(z, n);
^
1 error

Meiner Meinung nach muss meine Funktion addiereBruch nicht void sein, aber wenn sie nicht void ist, kann ich nicht zwei werte zurückgeben (return Zaehler, Nenner; geht nicht).

Ich wäre sehr dankbar, wenn jemand mir einen Rat geben könnte. 🙂
 
Zuletzt bearbeitet:
Hi,
Ich denke, dass fast alles richtig ist, aber ich bekomme einen Fehler, wenn ich das Programm kompilieren möchte und nämlich:
TestBruch.java:16: error: non-static method addiereBruch(int,int) cannot be referenced from a static context
Bruch.addiereBruch(z, n);
^
1 error
Die Exception sagt, dass die Methode addiereBruch(int,int) eine Instanz- Methode ist, du versuchst aber diese Methode statisch aufzurufen.
Du kannst es so machen:
Java:
   public static void main(String args[]){
   int zaehler = Terminal.askInt( "Der Zaehler von 1.Bruch ist: " );
   int nenner = Terminal.askInt( "Der Nenner von 1.Bruch ist: " );
    Bruch Bruch1 = new Bruch( zaehler, nenner );
   char mehr = 'a';
    while ( true ){
      mehr = Terminal.askChar( "Möglichkeiten: \n Bruch auf dem Bildschirm zeigen: [b] \n Ein Bruch dazu addieren: [a] \n Den Bruch umkehren: [u] \n Das Programm beenden: [e] " );
      if ( mehr == 'b' ){
          Bruch1.printBruch();
      }
      if ( mehr == 'a' ){
          int z = Terminal.askInt( "Der Zaehler von 2.Bruch ist: " );
          int n = Terminal.askInt( "Der Nenner von 2.Bruch ist: " );
          Bruch bruch2= new Bruch( zaehler, nenner );
          bruch2.addiereBruch(z, n);
          bruch2.printBruch();
      }  
       if ( mehr == 'u' ){
      Bruch umBruch = Bruch1;
      umBruch.printBruch();
          }
       if ( mehr == 'e' ){
      break;
       }
     }
    }

Der Unterschied von einer Statischen und einer Instanz Methode ist so:
Statische Methode:
Java:
public static void addiereBruch(int z, int n){..}
Instanz Methode:
Java:
public void addiereBruch(int z, int n){..}

Der Zugriff auf diese beiden Methoden ist unterschiedlich:
Auf Instanz Methoden können nur von Instanzen der jeweiligen Klasse zugegriffen werden.
z.B.:
Java:
Bruch bruch1 = new Bruch();
bruch1.addiereBruch(1,2){..}
Auf Klassen- Methoden kann nur via Klasse zugegrifen werden.
z.B.
Java:
Bruch.addiereBruch(1,2)

Meiner Meinung nach muss meine Funktion addiereBruch nicht void sein, aber wenn sie nicht void ist, kann ich nicht zwei werte zurückgeben (return Zaehler, Nenner; geht nicht).
Du kannst, wie du schon geschrieben hast, nicht 2 Werte zurückgeben, aber du kannst einen neuen Bruch zurückgeben:
Java:
public Bruch addiereBruch(int z, int n){
        if(Nenner != 0){
           if(Nenner == n){
           Zaehler += z;
           }else{
              int multi = Nenner*n;
              Zaehler = multi/Nenner;
              z = multi/n;
              Zaehler = Zaehler + z;
              Nenner = multi;
              return new Bruch(Zaehler, Nenner );
           }
            }else{ 
                 System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
                 return null;
            }
    }
Jedoch musst du konntrollieren, ob die Rückgabe von dieser Methode != null ist, sonst kann eine NullpointerException ausgelöst werden (falls Nenner == 0 ist), sobald du auf den zurückgegebenen Bruch zugreiffen möchtest.
z.B.
Java:
Bruch neuerBruch = bruch1.addiereBruch(1, 2);
if(neuerBruch != null)
   neuerBruch.print();
 
Zuletzt bearbeitet:
Hi,
Noch ein paar infos zu deinem Code:
Variablen sollten nie öffentlich sein. d.h. zaehler und nenner sollten stets private sein. Falls diese verändert werden sollten, kann dies mit Setter- Methoden gemacht werden. Zum lesen der Variablen kannst du Getter- Methoden einsetzen.

Ich hab dir als Beispiel mal die beiden Klassen erstellt:

Java:
public class Bruch {
	private int zaehler;
	private int nenner;
	
	public Bruch(int Zaehler, int Nenner){
		this.zaehler = Zaehler;
		this.nenner = Nenner;
	}
	
	public void printBruch(){
		if(nenner != 0){
			if(nenner < 0){
				zaehler = -zaehler;
				nenner = -nenner;
			}
			System.out.println(zaehler + "/" + nenner);
		}else{
			System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
		}
	}
	
	public Bruch addiereBruch(int z, int n){
		if(nenner != 0){
			if(nenner == n){
				zaehler += z;
				return new Bruch(zaehler, nenner);
			}else{
				int multi = nenner * n;
				zaehler = multi / nenner;
				z = multi / n;
				zaehler += z;
				nenner = multi;
				return new Bruch(zaehler, nenner);
			}
		}else{ 
			System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
			return null;
		}
	}
	
	public Bruch umkehrBruch(){
		if(nenner != 0 && zaehler != 0){
			return new Bruch(nenner, zaehler);
		}
		else{
			System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
			return null;
		}
	}


}
Dein While- Loop wird nie abgebrochen. Die bedingung ist stets true. Du solltest eine Abbruchbedingung einbauen (siehe nachfolgender code)
Die ganze if- Abfragen lassen sich mit Switch- Case eleganter und übersichtlicher darstellen. Obwohl immer nur 1 Bedingung true werden kann, werden bei deiner if- implementierung stets alle if- Konstrukte überprüft. Besser wäre es mit if() else if() else if() else()
Java:
import java.util.Scanner;


public class TestBruch {

	public static void main(String args[]){
		Scanner scanner = new Scanner(System.in);
		System.out.println("Der Zaehler von 1.Bruch ist: " );
		scanner.hasNextInt();
		int zaehler = scanner.nextInt();
		System.out.println("Der Nenner von 1.Bruch ist: ");
		int nenner = scanner.nextInt();
		Bruch bruch1 = new Bruch( zaehler, nenner );
		String mehr = "";
		boolean weiter = true;
		while ( weiter ){
			System.out.println("Möglichkeiten: \n Bruch auf dem Bildschirm zeigen: [b] \n Ein Bruch dazu addieren: [a] \n Den Bruch umkehren: [u] \n Das Programm beenden: [e] " );
			mehr = scanner.next();
			switch (mehr) {

			case "b" :
				bruch1.printBruch();
				break;
			case "a":
				System.out.println("Der Zaehler von 2.Bruch ist: ");
				int zaehler2 = scanner.nextInt();
				System.out.println("Der Nenner von 2.Bruch ist: ");
				int nenner2 = scanner.nextInt();
				bruch1 = bruch1.addiereBruch(zaehler2, nenner2);
				if(bruch1 != null)
					bruch1.printBruch();
				break;

			case "u":
				bruch1 = bruch1.umkehrBruch();
				if(bruch1 != null)
					bruch1.printBruch();
				break;
			case "e":
				weiter = false;
				break;
			}
		}
	}
}
 
Zuletzt bearbeitet:
Hi,
Hier noch eine Erweiterung, um Fehler bei der Eingabe abzufangen:
Java:
import java.util.InputMismatchException;
import java.util.Scanner;

public class TestBruch {

	public static void main(String args[]){
		Scanner scanner = new Scanner(System.in);
		try {
			System.out.print("Der Zaehler von 1.Bruch ist: " );
			scanner.hasNextInt();
			int zaehler = scanner.nextInt();
			System.out.print("Der Nenner von 1.Bruch ist: ");
			int nenner = scanner.nextInt();
			Bruch bruch1 = new Bruch( zaehler, nenner );
			String mehr = "";
			boolean weiter = true;
			while ( weiter ){
				System.out.println("Möglichkeiten:\n Bruch auf dem Bildschirm zeigen: [b]\n Ein Bruch dazu addieren: [a]\n Den Bruch umkehren: [u]\n Das Programm beenden: [e]");
				mehr = scanner.next();
				switch (mehr) {
					case "b" :
						bruch1.printBruch();
						break;
					case "a":
						System.out.print("Der Zaehler von 2.Bruch ist: ");
						int zaehler2 = scanner.nextInt();
						System.out.print("Der Nenner von 2.Bruch ist: ");
						int nenner2 = scanner.nextInt();
						bruch1 = bruch1.addiereBruch(zaehler2, nenner2);
						if(bruch1 != null)
							bruch1.printBruch();
						break;
					case "u":
						bruch1 = bruch1.umkehrBruch();
						if(bruch1 != null)
							bruch1.printBruch();
						break;
					case "e":
						weiter = false;
						break;
					default:
						System.out.println("Falsche Auswahl!");
						break;
				}
			}
		} catch (InputMismatchException ex) {
			System.err.println("Fehler, falsche Eingabe. Abbruch!");
		}
	}
}
 
Dein While- Loop wird nie abgebrochen. Die bedingung ist stets true. Du solltest eine Abbruchbedingung einbauen (siehe nachfolgender code)

Hm? Da war doch via break ein Abbruch. Ich fand das durchaus OK und mache das auch meistens so, wenn das Programm vom Typ her eine Endlosschleife ist, die auf Benutzer-Eingaben reagiert 🙂 Durch deine Variante mit switch-case geht es natürlich nicht mehr ohne Label, weil das break dann nur das switch verlässt.
 
Hm? Da war doch via break ein Abbruch. Ich fand das durchaus OK und mache das auch meistens so, wenn das Programm vom Typ her eine Endlosschleife ist, die auf Benutzer-Eingaben reagiert 🙂 Durch deine Variante mit switch-case geht es natürlich nicht mehr ohne Label, weil das break dann nur das switch verlässt.

Danke für deinen Hinweis. Jetzt sehe ich es auch... war wohl noch nicht ganz wach 😉
 
Vielen Dank, Leute!
Ich habe das Programm auf eigene Art und Weise gemacht, aber die Anweisung für Methode hat mir viel geholfen.
Es gab auch ein Problem mit der Addition, aber ist schon behoben:

Java:
public class Bruch{
   int zaehler;
   int nenner;
 public Bruch(int Zaehler, int Nenner){
	this.zaehler = Zaehler;
	this.nenner = Nenner;
 }
	public void printBruch(){
	   if(nenner != 0){
		if(nenner < 0){
		zaehler = -zaehler;
		nenner = -nenner;
		}
		System.out.println(zaehler+ "/" +nenner);
	    }else{ 
		System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	    }
	 }
	public Bruch addiereBruch(int z, int n){
		if(nenner != 0){
		   if(nenner == n){
		   zaehler += z;
		   return new Bruch(zaehler, nenner);
		   }else{
		      int multi = nenner * n;
		      zaehler = (multi / nenner) * zaehler;
		      z = (multi / n) * z; 
		      zaehler += z;
		      nenner = multi; 
		      return new Bruch(zaehler, nenner);
		   }
	        }else{ 
			System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
			return null;	        
		}
	 }
 	 public Bruch umkehrBruch(){
	   if(nenner != 0 && zaehler != 0){
	      return new Bruch(nenner, zaehler);
	   }else{ 
		  System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	 	  return null;  
	   }
         }
	   
}

Java:
public class TestBruch{
   public static void main(String args[]){
   int zaehler = Terminal.askInt( "Der Zaehler von 1.Bruch ist: " );
   int nenner = Terminal.askInt( "Der Nenner von 1.Bruch ist: " );
 	if(nenner == 0){
	System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	zaehler = Terminal.askInt( "Der Zaehler von 1.Bruch ist: " );
        nenner = Terminal.askInt( "Der Nenner von 1.Bruch ist: " );
        }
	Bruch Bruch1 = new Bruch(zaehler, nenner);
   char mehr = 'a';
    while ( true ){
      mehr = Terminal.askChar( "Möglichkeiten: \n Bruch auf dem Bildschirm zeigen: [b] \n Ein Bruch dazu addieren: [a] \n Den Bruch umkehren: [u] \n Das Programm beenden: [e] " );
      if ( mehr == 'b' ){
          Bruch1.printBruch();
      }
      if ( mehr == 'a' ){
          int zaehler2 = Terminal.askInt( "Der Zaehler von 2.Bruch ist: " );
          int nenner2 = Terminal.askInt( "Der Nenner von 2.Bruch ist: " );
          if(nenner2 != 0){
	        if(nenner2 < 0){
		zaehler2 = -zaehler2;
		nenner2 = -nenner2;
		}
	  Bruch1 = Bruch1.addiereBruch(zaehler2, nenner2);
          Bruch1.printBruch();
          }else{ 
		System.out.println("FEHLER - durch 0 kann man nicht teilen !!!");
	  }
	  
       }  
       if ( mehr == 'u' ){ 
	  Bruch1 = Bruch1.umkehrBruch();
          Bruch1.printBruch();
          
       }
       if ( mehr == 'e' ){
	  break;
       }
     }
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben