锯齿状数组和异常

时间:2017-05-05 16:18:41

标签: c# arrays exception jagged-arrays

另一个锯齿状阵列问题:

目前在类中而不是在Main()中使用锯齿状数组。使用这个锯齿状数组,我想针对自定义异常测试我的用户输入。目前,当我运行该程序时,它会创建数组,直到最后一点,我想填充数组并根据我的异常测试该数据。尽管用户输入正确,但例外仍在运行。我不确定错误是在我的异常中还是错误是我的数组。

注意:我知道其中一些可能看起来很复杂,但为了我正在做的事情,它必须保持这种状态。对不起:(

class StudentGrades
{
    private char[][] grades;
    private double totalGpa;
    private int totalClasses;
    private int semesters;

    public StudentGrades ()
    {
        totalClasses = 0;
        SetSemesters(4);
        grades = new char [semesters][];
    }


    public void InputSemesters()
    {
        int x;
        int semestNum;
        bool check;
        do
        {
            check = false;
            try
            {
                for (int r = 0; r < grades.Length; r++)
                {
                    if (r == 0)
                    {
                        semestNum = 1;

                    }
                    else if (r == 1)
                    {
                        semestNum = 2;
                    }
                    else if (r == 2)
                    {
                        semestNum = 3;
                    }
                    else
                    {
                        semestNum = 4;
                    }
                    Console.Write("How many courses were taken semster {0}? ", semestNum);
                    x = int.Parse(Console.ReadLine());
                    CreateSemesters(r, x);  
                }
            }
            catch (System.FormatException e)
            {
                Console.WriteLine("Problem with input.\n{0}\nTry again.", e.Message);
                check = true;
            }
        } while (check);

    }

    public void CreateSemesters(int sem, int numClasses)
    {
        grades[sem] = new char[numClasses];
        totalClasses += numClasses;
    }

    public void EnterGrades()
    {
        int semestNum;
        char letter;
        bool check;
        do
        {
            check = false;
            try
            {
                for (int r = 0; r < grades.Length; r++)
                {
                    if (r == 0)
                    {
                        semestNum = 1;

                    }
                    else if (r == 1)
                    {
                        semestNum = 2;
                    }
                    else if (r == 2)
                    {
                        semestNum = 3;
                    }
                    else
                    {
                        semestNum = 4;
                    }
                    for (int c = 0; c < grades[r].Length; c++)
                    {

                        Console.Write("Enter the letter grade for class {0} of semester {1}: ", c + 1, semestNum); //the array creation works up to this part. So I know the array is creating but not storing data.
                        letter = char.Parse(Console.ReadLine());
                        letter = grades[r][c];
                        CheckLetterGrade(letter);
                    }
                }
            }
            catch (IncorrectLetterGradeException excepObj)
            {
                Console.Write("That is not an acceptable letter grade. Try Again. \n{0}", excepObj.Message);
                Console.WriteLine();
                check = true;
            }
        } while (check);
    }

    public void CheckLetterGrade(char G)
    {
        if (G != 'A' || G != 'B' || G != 'C' || G != 'D' || G != 'F')
        {
            IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F");
            throw excepObj;
        }
    }

main()的

class UseStudentGrades
    {
        static void Main(string[] args)
        {
            StudentGrades student = new StudentGrades();
            // testing array functionality below
            student.InputSemesters();
            student.EnterGrades();
        }
    }

异常

class IncorrectLetterGradeException :
                System.ApplicationException
    {
        public IncorrectLetterGradeException(string exceptionType)
            : base (exceptionType)
        {
            //empty body
        }
    }

更新1: 目前正在尝试此更改以查看异常是否停止提示:

public void CheckLetterGrade(char G)
{
    bool gradeMatch = (G == 'A' || G == 'B' || G == 'C' || G == 'D' || G == 'F');        
    if (!gradeMatch)
    {
        IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F");
        throw excepObj;
    }
}

我遇到了这个问题:

Exception being thrown with correct user input

2 个答案:

答案 0 :(得分:0)

你的病情

if (G != 'A' || G != 'B' || G != 'C' || G != 'D' || G != 'F')

永远是真的。无论G中的角色是什么,它总是不等于其中一些字母。您应该使用&&,逻辑AND运算符而不是||逻辑OR运算符。

if (G != 'A' && G != 'B' && G != 'C' && G != 'D' && G != 'F')

这样,对于要抛出的异常,G中的字符必须与您的任何测试字母不相等。

另请注意,您的比较区分大小写。在比较之前,您可能希望转换为大写:

char c = Char.ToUpper(G);
if (c != 'A' && c != 'B' && c != 'C' && c != 'D' && c != 'F')

您的代码中存在第二个问题,在本节中:

  letter = char.Parse(Console.ReadLine());
  letter = grades[r][c];
  CheckLetterGrade(letter);

在这里,您可以从用户输入中分析您解析的字符中的字母。然后,使用从fractions数组中获得的值覆盖该值,从而完全失去用户输入的值。然后检查从成绩中获得的值(不是您从用户那里获得的值)。我不知道你尝试用中间线做什么,所以我不确定要建议的代码是什么,但这就是用户输入没有真正被检查的原因。我有一种感觉,你真的想要这个:

  letter = char.Parse(Console.ReadLine());
  grades[r][c] = letter;
  CheckLetterGrade(letter);

答案 1 :(得分:0)

正如已经指出的那样,问题是复杂的OR语句。有几种方法可以改进代码,使其更具可读性。

以下测试G 是否有效,然后检验否定。

public void CheckLetterGrade(char G)
{
    bool isValidGrade = (G == 'A' || G == 'B' || G == 'C' || G == 'D' || G == 'F');
    if (!isValidGrade)
    {
        IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F");
        throw excepObj;
    }
}

接下来,如果我们希望有效等级的测试更简洁,我们可以这样做:

bool isValidGrade = "ABCDF".Contains(G);

在C#中,字符串是一组字符,因此测试效果很好,并且可能更容易发现问题。