C# 交错数组和异常
另一个锯齿状数组问题: 当前在类中而不是在Main()中使用交错数组。使用这个锯齿状数组,我想针对自定义异常测试用户输入。当前,当我运行程序时,它会创建数组,直到我要填充数组并根据异常测试该数据的最后一点。尽管用户输入正确,但异常仍在运行。我不确定错误是在我的异常中还是在我的数组中 注意:我知道其中一些可能看起来很复杂,但为了我所做的,它必须保持这种方式。对不起:( 阶级 例外情况C# 交错数组和异常,c#,arrays,exception,jagged-arrays,C#,Arrays,Exception,Jagged Arrays,另一个锯齿状数组问题: 当前在类中而不是在Main()中使用交错数组。使用这个锯齿状数组,我想针对自定义异常测试用户输入。当前,当我运行程序时,它会创建数组,直到我要填充数组并根据异常测试该数据的最后一点。尽管用户输入正确,但异常仍在运行。我不确定错误是在我的异常中还是在我的数组中 注意:我知道其中一些可能看起来很复杂,但为了我所做的,它必须保持这种方式。对不起:( 阶级 例外情况 class IncorrectLetterGradeException : Sys
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这已被编辑以删除与我的问题不相关的项目。如果您有
列表如果(!validGrades.Contains(G))
@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);