除以零异常,知道它为什么会被抛出,但不知道如何修复它

Dividing by Zero Exeption, knowing why it gets thrown, not knowing how to fix it

为了更好的理解我先post我的程序Class.

Program.cs

namespace BeginnersGuidToLifting
{
    class Program
    {
        public static readonly int width = 85;
        public static readonly int height = 35;


        public static readonly User user = new User();
        public static readonly Goal goal = new Goal();
        public static Calories calories = new Calories();
        public static Nutrition nutrition = new Nutrition();
        public static Menu menu = new Menu();

        static void InitUser()
        {
            Console.WriteLine("\n### About You ###\n");

            user.Name = Question.AskString("Name: ");
            user.Age = Question.AskInt("Age: ");
            user.Gender = Question.AskString("Gender(m/f): ");
            user.Height = Question.AskInt("Height(cm): ");
            user.Weight = Question.AskInt("Weight(kg): ");

        }

        static void InitGoals()
        {
            Console.WriteLine("\n### What are your Goals ### \n");

            goal.GainWeight();
            goal.LoseWeight();
            goal.GetStronger();
            goal.GetLeaner();
            goal.StayFit();
            goal.Hypertrophy();

            Console.Write("Answer: ");
            var input = Console.ReadKey();

            switch (input.Key)
            {
                case ConsoleKey.D1:
                    goal.GoalStatusGainWeight = true;
                    goal.GoalMessage = "Your Goal is to Gain Weight";
                    break;
                case ConsoleKey.D2:
                    goal.GoalStatusLoseWeight = true;
                    goal.GoalMessage = "Your Goal is to Lose weight";
                    break;
                case ConsoleKey.D3:
                    goal.GoalStatusGetStronger = true;
                    goal.GoalMessage = "Your Goal is to get Stronger";
                    break;
                case ConsoleKey.D4:
                    goal.GoalStatusGetLeaner = true;
                    goal.GoalMessage = "Your Goal is to get Leaner";
                    break;
                case ConsoleKey.D5:
                    goal.GoalStatusStayFit = true;
                    goal.GoalMessage = "Your Goal is to Stay Fit";
                    break;
                case ConsoleKey.D6:
                    goal.GoalStatusHypertrophy = true;
                    goal.GoalMessage = "Your Goal is Hypertrophy";
                    break;
                default:
                    Console.WriteLine("Error");
                    break;
            }
        }

        static void InitMenu()
        {
            menu.ShowMenu();
            menu.Discalmer = false;
            //menu.Disclamer();

        }

        static void BmiResult()
        {
            var bodyType = user.GetBodyType();

            if (bodyType == User.BodyType.ReallyUnderweight)
            {
                Console.WriteLine("Really Underweigt");
            }
            else if (bodyType == User.BodyType.Underweight)
            {
                Console.WriteLine("Underweight");
            }
            else if (bodyType == User.BodyType.CloseToUnderwight)
            {
                Console.WriteLine("Close to Underweight");
            }
            else if (bodyType == User.BodyType.Healthy)
            {
                Console.WriteLine("at a Healthy Weight");
            }
            else if (bodyType == User.BodyType.Overweight)
            {
                Console.WriteLine("Overweight");
            }
            else if (bodyType == User.BodyType.Obese)
            {
                Console.WriteLine("Obese");
            }
            else if (bodyType == User.BodyType.SeverlyObese)
            {
                Console.WriteLine("Serverley Obese");
            }
            else if (bodyType == User.BodyType.MorbidlyObese)
            {
                Console.WriteLine("Morbidly Obese");
            }
        }

        static void Main(string[] args)
        {


            Console.Title = "Beginers Guide To Lifting";
            Console.SetWindowSize(width, height);
            Console.SetBufferSize(width, height);


            InitMenu();

            var userInput = Console.ReadKey();
            switch (userInput.Key)
            {
                case ConsoleKey.D1:
                    InitUser();
                    InitGoals();
                    break;
                case ConsoleKey.D2:
                    Console.WriteLine("Press 2");
                    break;
                default:
                    Console.WriteLine("Why y no work");
                    break;
            }


            //Status So Far
            Console.WriteLine("\n### Your Stats ### \n");

            Console.WriteLine("Name: {0} \nAge: {1} \nHeight: {2} \nWeight: {3}", user.Name, user.Age, user.Height, user.Weight);
            Console.WriteLine("Goal: {0}", goal.GoalMessage);

            BmiResult();


            Console.Write("\nContinue(y/n) to The Programm?: ");
            if (Console.ReadLine() == "y")
            {
                Console.Clear();
            }

            //Gain Weight Goal
            //Introduce 5x5
            var exercise = new FiveByFive();
            exercise.printIntroduction();

            //Show Exercises
            exercise.printWorkoutWeek1();
            exercise.printWorkoutWeek2();

            //Show Nutrition
            if (goal.GoalStatusGainWeight == true)
            {
                switch (user.Gender)
                {
                    case "male":
                    case "m":
                    case "Male":
                        calories.GainCaloriesMale(user);
                        break;
                    case "female":
                    case "f":
                    case "Female":
                        calories.GainCaloriesFemale(user);
                        break;
                }
            }

            //Lose Weight
            if (goal.GoalStatusLoseWeight == true)
            {
                switch (user.Gender)
                {
                    case "male":
                    case "m":
                    case "Male":
                        calories.LoseCaloriesMale(user);
                        break;
                    case "female":
                    case "f":
                    case "Female":
                        calories.LoseCaloriesFemale(user);
                        break;
                }
            }
        }
    }
}

问题出在我的主要方法中。

        InitMenu();

        var userInput = Console.ReadKey();
        switch (userInput.Key)
        {
            case ConsoleKey.D1:
                InitUser();
                InitGoals();
                break;
            case ConsoleKey.D2:
                Console.WriteLine("Press 2");
                break;
            default:
                Console.WriteLine("Why y no work");
                break;
        }

当我按下一个时,应该会出现它所显示的情况。 初始化用户和初始化用户目标。 当我按下 2 时,它会把我带到 User.cs class, 我在哪里为用户 BMI 做数学运算。

我真的不明白为什么按2会这样,因为我想显示的只是"Press 2"或稍后添加免责声明。

例外

System.DivideByZeroException: 'Attempted to divide by zero.'

抛出是因为它试图将 0 除以 0,那是因为还没有来自用户的输入。因为我想通过按 2 来显示另一个 window 和一些文本。那就是。

真不明白为什么跳转到用户class。

这里User.cs更好理解

namespace BeginnersGuidToLifting
{
    class User
    {
        public enum BodyType
        {
            ReallyUnderweight,
            Underweight,
            CloseToUnderwight,
            Healthy,
            Overweight,
            Obese,
            SeverlyObese,
            MorbidlyObese
        }

        public string Name;
        //private string _gender;
        public string Gender;
        private int _weight;
        private int _height;
        private int _age;

        public int Age
        {
            get => _age;
            set
            {
                if (value >= 0)
                {
                    _age = value;
                }
            }
        }

        public int Weight
        {
            get => _weight;
            set
            {
                if (value >= 0)
                {
                    _weight = value;
                }
            }
        }

        public int Height
        {
            get => _height;
            set
            {
                if (value >= 0)
                {
                    _height = value;
                }
            }
        }

        //TODO
        //public string Gender
        //{

        //    get => _gender;
        //    set
        //    {
        //        if (value == "female" || value == "f" || value == "male" || value == "m" )
        //        _gender = value;
        //        else
        //        {
        //            Console.WriteLine("Value Wrong");
        //        }
        //    }
        //}


        public int GetBmi()
        {
            Console.WriteLine("Weight:"+Weight);
            //var bmi = Math.Round((Weight / Math.Pow(Height, 2)) * 10000);
            int bmi = Weight / (Height * Height) * 10000;
            Console.WriteLine("Your Body Mass Index: " + bmi);
            Console.Write("That Means That you are: ");
            return bmi;
        }

        public BodyType GetBodyType()
        {
            int bmi = GetBmi();

            if (bmi < 16)
                return BodyType.ReallyUnderweight;
            else if (bmi >= 16 && bmi <= 17)
                return BodyType.Underweight;
            else if (bmi >= 17 && bmi <= 18.5)
                return BodyType.CloseToUnderwight;
            else if (bmi >= 18.5 && bmi <= 25)
                return BodyType.Healthy;
            else if (bmi >= 25 && bmi <= 30)
                return BodyType.Overweight;
            else if (bmi >= 30 && bmi <= 35)
                return BodyType.Obese;
            else if (bmi >= 35 && bmi <= 40)
                return BodyType.SeverlyObese;

            return BodyType.MorbidlyObese;
        }
    }
}

总结

  1. 当数字 1 和数字 2 为 switch 命令时调用 2 个动作 在键盘上按下。
  2. 当按 1 时一切正常并且 做它应该做的。
  3. 当按 2 时,它会尝试计算 还没有输入的东西,因为只有在什么时候才会询问输入 按 1.

预先感谢您抽出宝贵时间阅读本文。 欢迎任何意见。我希望一切都清楚明白。

在您按“2”并退出 switch 后,它会调用 BmiResult(),后者会调用用户 class 中的方法。

BmiResult() 调用 user.GetBodyType(),后者调用用户 class 的 GetBmi()。这是您进行计算的地方,但由于您没有为用户设置任何值,因此所有内容都默认为零。这意味着您正在这样做:

int bmi = 0 / (0 * 0) * 10000;

操作顺序意味着它这样做:

int bmi = (0 / 0) * 10000;

因为除法和乘法首先在括号内执行,然后从左到右。

但是,零乘以任何值仍然是零,因此您需要在计算之前检查除数是否为零,或者将代码包装在 try/catch 中并进行处理。