程序流程和异常处理
前言
-
顺序结构
-
选择结构
if语句、switch语句 -
循环结构
for语句、while语句、do…while语句和foreach语句 -
跳转语句
goto、break、continue、return、throw -
C#异常处理
顺序结构
- C#程序中语句执行的基本顺序按各语句出现位置的先后次序执行
选择结构
- 两种控制分支的条件语句:if语句和switch语句
-
单分支结构
if (条件表达式)
语句/语句块statement(s); -
双分支结构
if (条件表达式)
语句/语句块1;
else
语句/语句块2; -
多分支结构
if (条件表达式1)
语句/语句块1;
else if (条件表达式2)
语句/语句块2;
…
else if (条件表达式n)
语句/语句块n;
[else
语句/语句块n+1;]
循环结构
- C#提供4种不同的循环机制:for、while、do…while、foreach
for循环语句
计数型循环语句,一般用于已知循环次数的情况,所以也称为定次循环
for (initializer; condition; iterator)
{
循环体语句序列;
}
sumOdd =0; sumEven = 0;
for (int i=1; i<=100;i+=2) sumOdd +=i;
for (int i=2; i<=100;i+=2) sumEven +=i;
while循环
while(条件表达式)
{
循环体语句序列;
}
do…while循环
该循环的测试条件在执行完循环体之后执行,而while循环的测试条件在执行循环体之前执行
do
{
循环体语句序列;
} while(条件表达式);
int i = 1; int sum = 0;
do
{
sum += i; i++; //1~100中所有数的和
} while (i <= 100);
foreach循环
用于循环访问数组或集合以获取所需信息
foreach( 类型名称 变量名称 in 数组或集合名称)
{
循环体语句序列;
}
int[] myArray = new int[3] { 10, 20, 30 }; //3个整数的整数数组
foreach (int item in myArray) Console.Write(item+" "); //输出整数数组各元素
循环的嵌套
在一个循环体内又包含另一个完整的循环结构,称为多重循环结构
String s;
for (int i = 1; i <= 9; i++)
{
s = "";
for (int j = 1; j <= 9; j++)
{ //字符串左对齐,在右边用空格填充以达到指定的总长度8
s += (String.Format("{0}*{1}={2}", i, j, i * j)).PadRight(8);
}
Console.WriteLine(s);
}
跳转结构
使用跳转语句执行分支,该语句导致立即传递程序控制
goto
break
continue
return
throw
goto语句
将程序控制直接转到由标签标记的语句
goto identifier;
goto case 常量表达式;
goto default;
int i = 1, sum = 0;
loop:
if (i <= 100)
{
sum += i; i++; goto loop;
}
break语句
-
在多分支选择switch结构中的作用是跳出switch结构,继续执行switch语句的后继语句
-
break语句还可以用于退出for、foreach、while或do…while循环,即提前结束循环,接着执行循环语句的后继语句
continue语句
-
类似于break,也必须在for、foreach、while或do…while循环中使用
-
continue语句仅结束本次循环,并返回到循环的起始处,循环条件满足的话就开始执行下一次循环
-
break语句则是结束循环,跳转到循环的后继语句执行
-
continue语句只应用于最里层的语句。若要穿越多个嵌套层转移控制,必须使用goto语句
return语句
终止它出现在其中的方法的执行,并将控制返回给调用方法
int j = 0;
for (int i =100; i<= 200; i++)
{
if(i%3==0) continue;
Console.Write(“{0}”, i);
j++;
if(j%10==0) Console.WriteLine();
}
static double CalculateArea(int r) // 计算面积
{
double area = r * r * Math.PI;
return area; //方法CalculateArea以double值的形式返回变量Area
}
C#异常处理
三种错误:编译错误,运行时错误,逻辑错误
C#采用异常来处理系统级和应用程序级的错误状态,如:零除异常、下标越界、I/O错误等
try
{
// 可能引发异常的语句
}
catch (异常类型 异常变量)
{
// 在异常发生时执行的代码
}
finally
{
// 最终必须执行的代码(即使发生异常),如释放资源等
}
int i1 = 1, i2 = 0, i3, i4;
try
{
i3 = i1 / i2; //自动抛出异常DivideByZeroException
}
catch (DivideByZeroException e)
{
Console.WriteLine("零除错误!");
}
try
{
i4 = Int32.Parse("abc"); //自动抛出异常System.FormatException
}
catch (FormatException e)
{
Console.WriteLine("数值字符串格式错误!");
throw e; // 重新抛出异常
}
-
try-catch语句:一个try块后接一个或多个catch块
-
try-finally语句:一个try块后接一个finally块
-
try-catch-finally语句:一个try块后接一个或多个catch块,后面再跟一个finally块
-
内置异常类:System.Exception
【例4.23】自定义异常示例(InvalidNumberException.cs)。创建自定义异常,处理应用程序中出现负数参数的异常(例如,学生成绩处理类,不容许成绩为负数)
【例4.24】CLR自动抛出异常示例(ExceptionThrowByCLR.cs)
【例4.25】程序代码抛出异常示例(TryCopyObject.cs):调用方法,如果传入参数为null,则抛出异常
【例4.26】捕获处理异常示例(TryCatchTest.cs)