Search code examples
c#calculatordivide-by-zero

How to handle DivideByZeroExeption


I'm programming a Consolecalculator in C#. My problem is that I don't know how to handle the DivideByZeroExeption in the correct way. I want the user to have the chance to change the the incorrect "0" into another number. That should happen in the same calculation.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Program
    {
        //Program Start
        public static void Main(string[] args)
        {   
            //jaNein String um zu ermitteln ob erneut eine Rechnung gestellt werden soll
            //Der Operator wird in den rechenzeichen String eingelesen
            string jaNein, rechenzeichen = (null);
            //Start der Rechnerschleife
            do {

                int zahl_1 = Convert.ToInt32(null); //erste Zahl einlesen
                zahl_1 = (Fehlerklasse.fehlerzahl_1(zahl_1)); //erste Zahl weitergeben

                rechenzeichen = (Fehlerklasse.fehlerRechenzeichen(rechenzeichen)); //rechenzeichen einlesen

                int zahl_2 = Convert.ToInt32(null); //zeite Zahl einlesen
                zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2)); //zweite Zahl weitergeben

                var ergebnis = Ergebnis.rechenmethode(zahl_1, zahl_2, rechenzeichen); 
                Console.WriteLine(ergebnis); //ergebnis wird ausgelesen


                Console.WriteLine("Möchten sie erneut eine Rechnung stellen ? (ja / nein)"); //Frage an den Benutzer

                //Start einer schleife zur Ermittlung von jaNein
                do
                {          
                    jaNein = Console.ReadLine();
                    if (!(jaNein == "ja" | jaNein == "nein"))
                    { 
                        Console.WriteLine("Ungültige Antwort, bitte wählen sie (ja / nein)");
                    }
                }
                while (!(jaNein == "ja" | jaNein == "nein")); //löscht alles geschriebene in der Konsole

                Console.Clear();
            }

            while (jaNein == "ja"); //Führe die Rechnerschleife aus, solange jaNein "ja" ist
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Rechner
    {
        //Implementieren der Klasse Fehlerklasse
        Fehlerklasse fehlerbehen = new Fehlerklasse();
        //Methode zum Plusrechnen
        public int plus(int zahl_1, int zahl_2)
        {
            return zahl_1 + zahl_2;
        }
        //Methode zum Minusrechnen
        public int minus(int zahl_1, int zahl_2)
        {
            return zahl_1 - zahl_2;
        }
        //Methode zum Malrechnen
        public int mal(int zahl_1, int zahl_2)
        {
            return zahl_1 * zahl_2;
        }
        //Methode zum Geteiltrechnen
        public int geteiltdurch(int zahl_1, int zahl_2)
        {          
           if(zahl_2!= 0)
            {             
                return zahl_1 / zahl_2;
            }     
           else
            {
                Console.WriteLine("Die Division durch 0 ist verboten!");
                return zahl_2;
            }


        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Ergebnis
    {
        //Methode zur Ermittlung des Operators
        public static int rechenmethode(int zahl_1, int zahl_2, string rechenzeichen)
        {

          //var ergebnis auf 0 gesetzt
            var ergebnis = 0;
            //Klassen rechnen und Fehlerklasse implementiert
            Rechner rechnen = new Rechner();
            Fehlerklasse fehlerbehen = new Fehlerklasse();
            //Switchanweisung zur Ermittlung des Operators
            switch (rechenzeichen)
            {
                case "+":
                    ergebnis = rechnen.plus(zahl_1, zahl_2);

                    break;
                case "-":
                     ergebnis = rechnen.minus(zahl_1, zahl_2);

                    break;
                case "*":
                     ergebnis = rechnen.mal(zahl_1, zahl_2);

                    break;
                case "/":
                    ergebnis = rechnen.geteiltdurch(zahl_1, zahl_2);
                    break;
            }
            //Gibt die Variable ergebnis zurück
            return ergebnis;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace gmaare_consolen_rechner_1._0
{
    class Fehlerklasse
    {

        //Methdoe zum Sicherstellen dass zahl_1 eine Zahl ist
        public static int fehlerzahl_1(int zahl_1)

        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    zahl_1 = Convert.ToInt32(Console.ReadLine());
                    tryAgain = false;
                }
                catch (FormatException)

                {
                    Console.WriteLine("Geben sie eine gültige Zahl ein!");
                }
                catch (OverflowException)
                {
                    Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!");
                }
            }
            return zahl_1;
        }
        //Methdoe zum Sicherstellen dass zahl_2 eine Zahl ist
        public static int fehlerzahl_2(int zahl_2)

        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    zahl_2 = Convert.ToInt32(Console.ReadLine());
                    tryAgain = false;
                }
                catch (FormatException)
                {
                    Console.WriteLine("Geben sie eine gültige Zahl ein!");
                }
                catch (Exception )
                {
                    Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!");
                }
            }
            return zahl_2;
        }
        //Methode um zu verhindern dass andere Zeichen als +,-,*,/ als Operator verwendet werden
        public static string fehlerRechenzeichen (string rechenzeichen)
        {
            bool tryAgain = true;
            while (tryAgain)
            {
                try
                {
                    rechenzeichen = Console.ReadLine();
                   switch (rechenzeichen)
                    {
                        case "+":
                            break;
                        case "-":
                            break;
                        case "*":
                            break;
                        case "/":
                            break;
                        default:
                            throw new FormatException();
                    }
                    tryAgain = false;
                }
                catch (FormatException)
                {
                    Console.WriteLine("Geben sie ein gültiges Rechenzeichen ein! (+,-,*,/)");
                }
            }
            return rechenzeichen;
        }


    }
}

Solution

  • If I understand what you're asking correctly, you simply want to prevent the case where the divisor in the division operation is 0 and prompt the user for a new divisor in that case. This could be handled with a check at the time of the initial input, or you could adjust your division method like this:

    //Methode zum Geteiltrechnen
            public int geteiltdurch(int zahl_1, int zahl_2)
            {          
               if(zahl_2!= 0)
                {             
                    return zahl_1 / zahl_2;
                }     
               else
                {
                    Console.WriteLine("Die Division durch 0 ist verboten!");
                    Console.Write("Please enter another divisor: ");
                    zahl_2 = Convert.ToInt32(Console.ReadLine());
                    //You'll want to do some validation here.
                    return geteiltdurch(zahl_1, zahl_2);
                }
            }
    

    You could also do something similar with a while loop. Ultimately, it would be better to check for the 0 before calling the division, though -- that way you don't need to duplicate the checks for whether the input is a number, etc. The basic logic is the same -- write the prompt and read the input until you get a valid nonzero input.