Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 交错数组和异常_C#_Arrays_Exception_Jagged Arrays - Fatal编程技术网

C# 交错数组和异常

C# 交错数组和异常,c#,arrays,exception,jagged-arrays,C#,Arrays,Exception,Jagged Arrays,另一个锯齿状数组问题: 当前在类中而不是在Main()中使用交错数组。使用这个锯齿状数组,我想针对自定义异常测试用户输入。当前,当我运行程序时,它会创建数组,直到我要填充数组并根据异常测试该数据的最后一点。尽管用户输入正确,但异常仍在运行。我不确定错误是在我的异常中还是在我的数组中 注意:我知道其中一些可能看起来很复杂,但为了我所做的,它必须保持这种方式。对不起:( 阶级 例外情况 class IncorrectLetterGradeException : Sys

另一个锯齿状数组问题:

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

注意:我知道其中一些可能看起来很复杂,但为了我所做的,它必须保持这种方式。对不起:(

阶级

例外情况

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;
    }
}
我得到了这个问题:

你的状况

if (G != 'A' || G != 'B' || G != 'C' || G != 'D' || G != 'F')
将始终为true。无论
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);
在这里,您从用户输入中解析的字符中指定字母。然后,您使用从分数数组中获得的值覆盖该值,从而完全丢失用户输入的值。然后您检查从分数中获得的值(而不是从用户获得的值).我不知道你想用中间的那一行做什么,所以我不确定建议使用什么正确的代码,但这就是为什么用户条目没有真正得到检查的原因。我有一种感觉,你确实想要这样:

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

正如已经指出的,问题在于复杂的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#中,字符串是字符的集合,因此测试工作正常,并且可能更容易发现问题。

我很确定可以将您的问题的代码缩减到最低限度。谁应该阅读这些内容?@maf soft这已被编辑以删除与我的问题不相关的项目。如果您有
列表
@BerinLoritsch-或者仅仅是一个简单的字符串
“ABCDF”,那么测试可以变得更加可读
。我同意,有些地方还可以改进。当我进入A级时,仍然会得到异常提示?也许我的条件措词不正确?异常应该只提示非A-D或F的字母。不幸的是,它必须是丑陋的,否则我很乐意采取最简单的方法。@ZLackLuster-我必须看看是什么您将其更改为仍然不起作用。我认为我介绍的内容会起作用。但是,请注意,如果用户输入小写字符,也将不匹配。您可能希望将他们的输入转换为大写以简化测试。仍然会引发异常。我认为错误存在于数组的填充中,但我“我不确定。
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);