rekursive division/0 mit exception

mlion

Mitglied
Leider bricht mein Code schon nach der Eingabe 2. ab. Wieso ist er nicht rekursiv?


Java:
import java.util.Scanner;

public class Exception1 {

    public int division(int zaehler, int nenner) throws ArithmeticException {
        if (nenner == 0) {
            throw new ArithmeticException("division durch 0 nicht durchfuehrbar");
        }
        return (zaehler/nenner);
    }
 
    public static void main(String[] args) {
     
       Exception1 x = new Exception1();
       Scanner eingabe = new Scanner(System.in);
    
        try {
            x.division(1,0);
        } catch(ArithmeticException e) {
            x.division(1,0);
        } finally {
            eingabe.close();
        }
    }
}
 
Zuletzt bearbeitet:

MiMij

Bekanntes Mitglied
Rekursiv würde ja bedeuten er müsste die Methode division() immer wieder aufrufen, aber du rufst sie nur nochmal auf wenn eine Exception auftritt. D.h. geb ich als Nenner die 0, fragt er erneut nach zähler und nenner. Ansonsten kommt er nie wieder in die methode rein.
D.h. nur beim ersten mal fängst du die Exception ab dann aber nicht mehr.
 

mlion

Mitglied
Ja stimmt dann muesste ich division() nochmal in sich selbst aufrufen lassen.
bin ein wenig ratlos wie so eine Funktionalitaet einfuegen soll, ich kann es ja auch nicht nach dem
werfen der Exception einsetzen, da soweit ich verstanden habe der code dort abbricht.
 

MiMij

Bekanntes Mitglied
Er bricht nicht ab, er beendet das Programm weil er ins finally rein kommt.
Du könntest eine while-Schleife verwenden bzw do-while und solange eine 0 als Nenner eingegeben wird (bzw solange ein Fehler auftritt), immer wieder erneut Zähler und Nenner abfragen
 

MoxxiManagarm

Top Contributor
Aber die Wiederholung der Division, falls 0, wäre per se erstmal keine Rekursion sondern Induktion. Falls es eine Aufgabe ist und es heißt Implementiere die Division rekursiv, dann sollst du vermutlich auf / verzichten und stattdessen die Division durch rekursive Subtrahierung implementieren.

f(x, y) = 1 + f(x - y, y) ⇔ x >= y; y <> 0
f(x, y) = 0 ⇔ x < y; y <> 0
 
Zuletzt bearbeitet:

mlion

Mitglied
Aber die Wiederholung der Division, falls 0, wäre per se erstmal keine Rekursion sondern Induktion. Falls es eine Aufgabe ist und es heißt Implementiere die Divion rekursiv, dann würde ich meinen ist gewollt, dass auf / verzichtet wird und stattdessen die Division durch rekursive Subtrahierung implementiert werden soll.

Es ist keine Aufgabe, es soll mir nur selber zum Verstaendniss der Materie helfen, in diesem Fall: Rekursion und Exceptions.
Ich versuch einfach nochmal zu deutlich zu machen was genau ich überhaupt versuche zu machen:
Ich würde gern ein Code entwerfen welcher, nenner & zaehler mittels einer Methode abfragt und solange es eine nicht durchfuehrbare Operation ist(sprich 1/0) eine Exception wirft und den Methode erneut aufruft, solange bis Ausfuehrbar.
Meine Problem ist( ich meine mal das es mein Problem ist), dass ich nicht weis wo ich meine Methode erneut aufrufen soll.
Code:
import java.util.Scanner;
import Êxceptions.eigene_Exception;


public class Exception1 {

    public int division(int zaehler, int nenner)
        throws eigene_Exception {
        Scanner eingabe = new Scanner(System.in);

        while (nenner == 0) {
            throw new eigene_Exception("division durch 0 nicht durchfuehrbar");
           //so würde ich es machen, aber das geht ja nicht da nach throw abbricht
            division(eingabe.nextInt(), eingabe.nextInt());
        }
        return (zaehler/nenner);
    }
   
    public static void main(String[] args) {
      
       Exception1 x = new Exception1();
       Scanner eingabe = new Scanner(System.in);
      
        try {

            System.out.println("gebe ein: zaehler / nenner");
            x.division(eingabe.nextInt(), eingabe.nextInt());
        } catch(eigene_Exception e) {
            System.out.println("Fehlerbehandlung?");
           
        }
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Es ist keine Aufgabe, es soll mir nur selber zum Verstaendniss der Materie helfen, in diesem Fall: Rekursion und Exceptions.
Beide sind deutlich einfacher zu nutzen, wenn man sie nicht vermischt. Kombiniert bringt es meist mehr Probleme.

Setz es erstmal Rekursiv ohne Exceptions und dann mit Exceptions aber ohne Rekursion um ;)
 

MoxxiManagarm

Top Contributor
Rein nach dem EVA-Prinzip (Eingabe Verarbeitung Ausgabe) ist die erneute Eingabe während der Verarbeitung keine schöne Sache. Ich halte persönlich sehr viel von dem Prinzip und ich kann dir nur empfehlen dich auch daran zu halten.

Was du aber machen könntest wäre den gesamten EVA-Vorgang in der Exception rekursiv zu gestalten, nur die Division selbst wäre dann nicht mehr rekursiv. Du hättest dann also 2 Funktionen.
 
Zuletzt bearbeitet:

mlion

Mitglied
okay hab jetzt erstmal die Rekursion probiert und gemerkt das mir da schon grundlegende Probleme habe
- werde noch mal Java Insel WebBuch schauen, da mein vorliegendes buch keine Rekursion behandelt

Code:
import java.util.Scanner;

public class rekursion_division {
  
    public int division(int zaehler, int nenner) {
        Scanner eingabe = new Scanner(System.in);
  
        while (nenner == 0) {
            System.out.println("eingabe:  nenner+zaehler");
            zaehler = eingabe.nextInt();
            nenner = eingabe.nextInt();
            division(zaehler, nenner);
        }
        return (zaehler/nenner);
    }
  
    public static void main(String[] args) {
        rekursion_division x = new rekursion_division();
      
        System.out.println(x.division(1, 0));
    }
}

ruft sich öfter auf als es sollte
 

mlion

Mitglied
okay langsam kommen wir der sache näher :d
die Rekursion funktioniert soweit, allerdings werden die Parameter scheinbar nicht richtig überschrieben.
Wenn ich beim ersten Konsolenaufruf (1,1) eingebe, wird auch 1 ausgegeben, wenn ich vorher (1,0) und dann (1,1) bekomm ich 1/0 ausgegeben.

Code:
package Êxceptions;

import java.util.Scanner;

public class rekursion_division {
   
    public int division(int zaehler, int nenner) {
        Scanner eingabe = new Scanner(System.in);
   
        if (nenner == 0){
            System.out.println("eingabe:  nenner+zaehler");
            zaehler = eingabe.nextInt();
            nenner = eingabe.nextInt();
            division(zaehler, nenner);
        }
        return (zaehler/nenner);
    }
   
    public static void main(String[] args) {
        rekursion_division x = new rekursion_division();
       
        int ergebniss= x.division(1,0);
        System.out.println(ergebniss);
    }
}
 

mlion

Mitglied
Ah ich habs

Code:
package Êxceptions;

import java.util.Scanner;

public class rekursion_division {
   
    public int division(int zaehler, int nenner) {
        Scanner eingabe = new Scanner(System.in);
   
        if (nenner == 0){
            System.out.println("eingabe:  nenner+zaehler");
            zaehler = eingabe.nextInt();
            nenner = eingabe.nextInt();
            return (division(zaehler, nenner));
        }
        return (zaehler/nenner);
    }
   
    public static void main(String[] args) {
        rekursion_division x = new rekursion_division();
       
        int ergebniss= x.division(1,0);
        System.out.println(ergebniss);
    }
}
 

MoxxiManagarm

Top Contributor
Java:
    public int division(int zaehler, int nenner) {
        Scanner eingabe = new Scanner(System.in);
 
        while (nenner == 0) {
            System.out.println("eingabe:  nenner+zaehler");
            zaehler = eingabe.nextInt();
            nenner = eingabe.nextInt();
            division(zaehler, nenner);
        }
        return (zaehler/nenner);
    }

Da hast du wieder die Eingabe während der Verarbeitung. Tus nicht!

Du kannst dir doch eine weitere Methode ala macheEineDivision() erstellen, welche die Parameter einliest, dann dividiere(z, n) verarbeitet und das Ergebnis oder den Excpetiontext ausgibt. Also EVA einmal durch. Und im Falle du bist in der Exception kannst du macheEineDivision() erneut aufrufen. Das ist möglich.
 

mlion

Mitglied
Java:
    public int division(int zaehler, int nenner) {
        Scanner eingabe = new Scanner(System.in);
 
        while (nenner == 0) {
            System.out.println("eingabe:  nenner+zaehler");
            zaehler = eingabe.nextInt();
            nenner = eingabe.nextInt();
            division(zaehler, nenner);
        }
        return (zaehler/nenner);
    }

Da hast du wieder die Eingabe während der Verarbeitung. Tus nicht!

Du kannst dir doch eine weitere Methode ala macheEineDivision() erstellen, welche die Parameter einliest, dann dividiere(z, n) verarbeitet und das Ergebnis oder den Excpetiontext ausgibt. Also EVA einmal durch. Und im Falle du bist in der Exception kannst du macheEineDivision() erneut aufrufen. Das ist möglich.

Ich kann mir leider nicht erschliessen wie ich dann neue Eingaben tätigen kann wenn sich sich die Methode erneut aufruft.
In macheEineDivision() soll mein Scanner wie ich verstanden habe nämlich auch nicht rein.

2.Meinst du ich soll eingabe nie in meinen eigentlichen methoden nutzen sondern lediglich in meiner main?
 

MiMij

Bekanntes Mitglied
Ihr habt natürlich recht mit der while-Schleife, das wäre dann eine Iteration

Normalerweise sieht eine Rekursion folgendermaßen aus

Code:
main(){
  rekursiveMethode(a);
}

rekursiveMethode(a){
if (irgendeine bedingung mit a) {
    return ...;
} else {
    rekursiveMethode(mache was mit a und gib den neuen wert erneut an die methode);
}

Vergleich Iteration und iteration
https://www.java-tutorial.org/iteration_und_rekursion.html
 

MoxxiManagarm

Top Contributor
Meinst du ich soll eingabe nie in meinen eigentlichen methoden nutzen sondern lediglich in meiner main?

Bei solchen kleinen Themen wie der Division mag dir das ganze vielleicht noch nicht so sinnig vorkommen und ist sicherlich auch nicht ganz so wichtig. Es bleibt übersichtlich.

Aber sagen wir du hast einen Adressbuch. In deiner ersten Version hast du alle Adressen in Dateien vorliegen, du sortierst die Adressen mit Bubble Sort und gibst diese auf der Konsole aus. Jetzt bist du weiter und willst die Textdateien loswerden. In deiner zweiten Version nimmst du eine Datenbank. Du musst wahrscheinlich lediglich die Eingabe ändern. Auch gefällt dir die Konsole nicht mehr, du willst es nun auf einer GUI (z.B. Swing) anzeigen, du musst nur die Ausgabe ändern. Dann fällt dir ein der Merge Sort ist eventuell doch besser geeignet als der Bubble Sort. Du änderst nur die Verarbeitung.

Oder denke an Multi-Device. Du willst für jedes Device keine eigene Logik bauen, sondern nur die Ausgabe auf diesem Device. Also ja ich würde die einzelnen Teile so gut wie möglich trennen.

Deine Division könnte theoretisch auch mal eine GUI bekommen. Natürlich ist die Division schnell wieder programmiert egal auf welche Plattform du sie anwendest. Aber es gibt weitaus komplexere Anwendungen, bei denen du froh bist, dass du sie nicht wieder anfassen musst.

Oder sie als Beispiel die Möglichkeit die Division als rekursiven Aufruf zu implementieren. In diesem Fall würdest du nur diese eine Methode ändern, nicht jedoch dein Main.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Rekursive Methode Java Basics - Anfänger-Themen 13
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
Viktor A. Kaiser Rekursive Algorithmen Java Basics - Anfänger-Themen 9
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
new_to_coding Rekursive Reihe implementieren Java Basics - Anfänger-Themen 1
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
S Rekursive Kombinationen Java Basics - Anfänger-Themen 6
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
schredder Rekursive Quadratzahlen - Ergebnisprozedur Java Basics - Anfänger-Themen 1
A Rekursive Implementation eines Codes Java Basics - Anfänger-Themen 4
L Rekursive Methoden Java Basics - Anfänger-Themen 14
C Rekursive Methode in Interative Methode umwandeln Java Basics - Anfänger-Themen 17
G Rekursive Methode mit 2 Aufrufen Java Basics - Anfänger-Themen 1
J Rekursive Folge (a=a-1) Java Basics - Anfänger-Themen 9
M Rekursive Java-Methode Java Basics - Anfänger-Themen 13
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
macle Rekursive String Methode, Gerade Zahlen rausfiltern Java Basics - Anfänger-Themen 10
M Rekursive Prüfung ob ein Array sortiert ist... Java Basics - Anfänger-Themen 4
J Rekursive swapArray Methode Java Basics - Anfänger-Themen 69
D Rekursive Methode Java Basics - Anfänger-Themen 8
R Methoden rekursive Methoden Java Basics - Anfänger-Themen 6
O Quersumme rekursive Methode Java Basics - Anfänger-Themen 3
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
M Rekursive Methode Programmieren Java Basics - Anfänger-Themen 3
J rekursive Methode Java Basics - Anfänger-Themen 26
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
MiMa Rekursive Dateiliste erstellen mit Dateiendung(en) ?? Java Basics - Anfänger-Themen 4
S Rekursive Methode Java Basics - Anfänger-Themen 8
O Rekursive Methode Java Basics - Anfänger-Themen 4
V Methoden Rekursive Methode mit String als Rückgabe Java Basics - Anfänger-Themen 7
K Rekursive Methode Java Basics - Anfänger-Themen 1
K Rekursive Methode für Fakultät mit BigInteger Java Basics - Anfänger-Themen 10
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
J Methoden Rekursive Return Methode Java Basics - Anfänger-Themen 2
G Harmonische Rekursive Folge Java Basics - Anfänger-Themen 3
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
B Datentypen Suchbaum - Rekursive Ausgabe Java Basics - Anfänger-Themen 1
P Methoden Rekursive Methode für Potenzen Java Basics - Anfänger-Themen 2
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
S Eine rekursive Lösung Java Basics - Anfänger-Themen 4
S Int zu Hexadezimal - Rekursive Methode Java Basics - Anfänger-Themen 2
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
N Rekursive Addition mit Scanner Java Basics - Anfänger-Themen 12
shiroX OOP Rekursive und Iterative Definition Java Basics - Anfänger-Themen 2
B Methoden Rekursive Methoden Java Basics - Anfänger-Themen 2
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
C rekursive methode Java Basics - Anfänger-Themen 2
D Methoden Rekursive Methoden Java Basics - Anfänger-Themen 13
R rekursive Methode funktioniert nicht Java Basics - Anfänger-Themen 4
M Stürzen alle Rekursive Methoden irgendwann ab? Java Basics - Anfänger-Themen 11
D Primzahlen und Rekursive Liste Java Basics - Anfänger-Themen 29
R Rekursive Methode, Files finden Java Basics - Anfänger-Themen 2
S rekursive folge verbessern Java Basics - Anfänger-Themen 2
C rekursive Methode verstehe nicht! Java Basics - Anfänger-Themen 3
S Methoden rekursive Methode funktioniert nicht Java Basics - Anfänger-Themen 4
E Rekursive Methode Java Basics - Anfänger-Themen 3
N Methoden Rekursive Fibonaccizahlen mit Array Java Basics - Anfänger-Themen 2
R Rekursive Ausgabe eines Binärbaums Java Basics - Anfänger-Themen 4
J Methoden Rekursive Potenz ohne Math.Pow() Java Basics - Anfänger-Themen 9
A Rekursive Methode in Iterative umwandeln Java Basics - Anfänger-Themen 6
S Labyrith Rekursive Wegsuche Java Basics - Anfänger-Themen 4
C Rekursive Methode - Ziffern in Zahl Java Basics - Anfänger-Themen 33
U Dezimal zu Hexadezimal rekursive Funktion Java Basics - Anfänger-Themen 8
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
L iterative und rekursive Folge Java Basics - Anfänger-Themen 20
G Rekursive Methode Java Basics - Anfänger-Themen 3
A rekursive Listen in Java? Java Basics - Anfänger-Themen 5
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
E Rekursive Methode mit Zufallsarray Java Basics - Anfänger-Themen 6
E Rekursive Methode Java Basics - Anfänger-Themen 18
U Rekursive lösung von pascal dreieck Java Basics - Anfänger-Themen 11
M Rekursive Methode - wo ist der Fehler? Java Basics - Anfänger-Themen 4
J rekursive methode Java Basics - Anfänger-Themen 6
H ScrollBar inaktiv / Rekursive Methode Java Basics - Anfänger-Themen 4
J Rekursive Methode Java Basics - Anfänger-Themen 11
G Rekursive Methode Java Basics - Anfänger-Themen 5
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
K Rekursive Methoden Java Basics - Anfänger-Themen 15
K Rekursive Funktion (Verständnissfrage) Java Basics - Anfänger-Themen 5
S Rekursive Bruch potenzierung Java Basics - Anfänger-Themen 2
D rekursive Summenberechnung Java Basics - Anfänger-Themen 8
J Rekursive Methode: Fakultaet berechnen Java Basics - Anfänger-Themen 5
E Rekursive definierten Folge Java Basics - Anfänger-Themen 10
A HILFE! Rekursive Funktion Java Basics - Anfänger-Themen 20
kulturfenster rekursive Binaere Suche Java Basics - Anfänger-Themen 12
F Rekursive Aufrufe, Parameterübergabe, call by reference Java Basics - Anfänger-Themen 3
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
B Rekursive & schreiben im ArrayList Java Basics - Anfänger-Themen 2
J Rekursive Fkt. Java Basics - Anfänger-Themen 2
A Rekursive Dateisuche Java Basics - Anfänger-Themen 12
K rekursive Funktion mit mehreren Parametern Java Basics - Anfänger-Themen 5
G rekursive Methode Java Basics - Anfänger-Themen 3
N rekursive Beispiele Java Basics - Anfänger-Themen 3
G rekursive u iterative Methode Java Basics - Anfänger-Themen 8
G Rekursive Methode Java Basics - Anfänger-Themen 7
ven000m Rekursive Funktionen - Frage Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben