如何处理DivideByZeroExeption

时间:2015-10-06 15:35:19

标签: c# calculator divide-by-zero

我正在使用C#编写Consolecalculator。我的问题是我不知道如何以正确的方式处理DivideByZeroExeption。我希望用户有机会将不正确的“0”更改为另一个数字。这应该在同一计算中发生。

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;
        }


    }
}

2 个答案:

答案 0 :(得分:0)

如果您检索“rechenzeichen”和“zahl_2”,只需在代码的这一部分周围进行操作,以便检查第二个数字是否与操作员兼容。

var avoidedDivideByZero = false;
do
{
    int zahl_2 = Convert.ToInt32(null);
    zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2));

    if(rechenzeichen != @"/" || zahl_2 != 0)
    {
        avoidedDivideByZero = true;
    }
    else
    {
        Console.WriteLine(@"Cannot divide by 0, please enter another number.");
    }
}
while(!avoidedDivideByZero)

我想我已经理解了“zahl_2”和“rechenzeichen”的含义。我会将它重构为一个单独的方法,以便它不会使你的主循环与检查混乱,但应该允许你刚才继续。

答案 1 :(得分:0)

如果我理解你正确提出的问题,你只想防止除法运算中除数为0的情况,并在这种情况下提示用户使用新的除数。这可以通过初始输入时的检查来处理,或者您可以像这样调整分割方法:

//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);
            }
        }

你也可以用while循环做类似的事情。最终,在调用除法之前检查0会更好 - 但是这样你就不需要复制检查输入是否是数字等等。基本逻辑是相同的 - 写入提示并读取输入,直到获得有效的非零输入。