background image

Module 4: 

Statements and 

Exceptions

background image

Overview

Introduction to Statements

Using Selection Statements

Using Iteration Statements

Using Jump Statements

Handling Basic Exceptions

Raising Exceptions

background image

 Introduction to Statements

Statement Blocks

Types of Statements

background image

Statement Blocks

Use braces  

As block 

delimiters

{

  // code

}

{

  // code

}

{

  int i;

  ...

  {

    int i;

    ...

  }

}

{

  int i;

  ...

  {

    int i;

    ...

  }

}

{

  int i;

  ...

}

...

{

  int i;

  ...

}

{

  int i;

  ...

}

...

{

  int i;

  ...

}

A block and its 

parent block 

cannot have a 

variable with 

the same name

Sibling 

blocks can 

have 

variables 

with 

the same 

name

background image

Types of Statements

Selection Statements
      The if and switch statements

Selection Statements
      The if and switch statements

Iteration Statements
      The while, do, for, and foreach statements

Iteration Statements
      The while, do, for, and foreach statements

Jump Statements
      The goto, break, and continue statements

Jump Statements
      The goto, break, and continue statements

background image

 Using Selection Statements

The if Statement

Cascading if Statements

The switch Statement

Quiz: Spot the Bugs

background image

The if Statement

Syntax:

No implicit conversion from int to bool 

int x;
...
if (x) ...    // Must be if (x != 0) in C#
if (x = 0) ... // Must be if (x == 0) in C#
 

int x;
...
if (x) ...    // Must be if (x != 0) in C#
if (x = 0) ... // Must be if (x == 0) in C#
 

if ( Boolean-expression )
  first-embedded-statement
else
  second-embedded-statement

if ( Boolean-expression )
  first-embedded-statement
else
  second-embedded-statement

background image

Cascading if Statements

enum Suit { Clubs, Hearts, Diamonds, Spades }
Suit trumps = Suit.Hearts; 
if (trumps == Suit.Clubs)
    color = "Black";
else if (trumps == Suit.Hearts)
    color = "Red";
else if (trumps == Suit.Diamonds)
    color = "Red"; 
else
    color = "Black";

enum Suit { Clubs, Hearts, Diamonds, Spades }
Suit trumps = Suit.Hearts; 
if (trumps == Suit.Clubs)
    color = "Black";
else if (trumps == Suit.Hearts)
    color = "Red";
else if (trumps == Suit.Diamonds)
    color = "Red"; 
else
    color = "Black";

background image

The switch Statement

Use switch statements for 

multiple case blocks

Use break statements to ensure 

that no fall through occurs 

switch (trumps) {
case Suit.Clubs :
case Suit.Spades :
    color = "Black"; break;
case Suit.Hearts :
case Suit.Diamonds :
    color = "Red"; break; 
default:
    color = "ERROR"; break;
}

switch (trumps) {
case Suit.Clubs :
case Suit.Spades :
    color = "Black"; break;
case Suit.Hearts :
case Suit.Diamonds :
    color = "Red"; break; 
default:
    color = "ERROR"; break;
}

background image

Quiz: Spot the Bugs

if number % 2 == 0   ...

if number % 2 == 0   ...

if (percent < 0) || (percent > 100) ...

if (percent < 0) || (percent > 100) ...

if (minute == 60);
    minute = 0;

if (minute == 60);
    minute = 0;

switch (trumps) {
case Suit.Clubs, Suit.Spades :
    color = "Black";
case Suit.Hearts, Suit.Diamonds :
    color = "Red";
defualt :
    ...
}

switch (trumps) {
case Suit.Clubs, Suit.Spades :
    color = "Black";
case Suit.Hearts, Suit.Diamonds :
    color = "Red";
defualt :
    ...
}

2

2

2

2

3

3

3

3

4

4

4

4

1

1

1

1

background image

 Using Iteration Statements

The while Statement

The do Statement

The for Statement

The foreach Statement

Quiz: Spot the Bugs

background image

The while Statement

Execute embedded statements based 

on Boolean value

Evaluate Boolean expression at 

beginning of loop

Execute embedded statements while 

Boolean value 

Is True

int i = 0;
while (i < 10) {
    Console.WriteLine(i);
    i++;
}

int i = 0;
while (i < 10) {
    Console.WriteLine(i);
    i++;
}

0 1 2 3 4 5 6 7 8 9

background image

The do Statement

Execute embedded statements based 

on Boolean value

Evaluate Boolean expression at end of 

loop

Execute embedded statements while 

Boolean value 

Is True

int i = 0;
do {
    Console.WriteLine(i);
    i++;
} while (i < 10);

int i = 0;
do {
    Console.WriteLine(i);
    i++;
} while (i < 10);

0 1 2 3 4 5 6 7 8 9

background image

The for Statement

Place update information at the start of the 

loop

Variables in a for block are scoped only within 

the block

A for loop can iterate over several values

for (int i = 0; i < 10; i++) {
    Console.WriteLine(i);           
}

for (int i = 0; i < 10; i++) {
    Console.WriteLine(i);           
}

0 1 2 3 4 5 6 7 8 9

for (int i = 0; i < 10; i++)
    Console.WriteLine(i);
Console.WriteLine(i); // Error: i is no longer in scope

for (int i = 0; i < 10; i++)
    Console.WriteLine(i);
Console.WriteLine(i); // Error: i is no longer in scope

for (int i = 0, j = 0; ... ; i++, j++)

for (int i = 0, j = 0; ... ; i++, j++)

background image

The foreach Statement

Choose the type and name of the 

iteration variable

Execute embedded statements for 

each element of the collection class

ArrayList numbers = new ArrayList( );
for (int i = 0; i < 10; i++ ) {
    numbers.Add(i);
}

foreach (int number in numbers) {
    Console.WriteLine(number);
}

ArrayList numbers = new ArrayList( );
for (int i = 0; i < 10; i++ ) {
    numbers.Add(i);
}

foreach (int number in numbers) {
    Console.WriteLine(number);
}

0 1 2 3 4 5 6 7 8 9

background image

Quiz: Spot the Bugs

for (int i = 0, i < 10, i++)
    Console.WriteLine(i);

for (int i = 0, i < 10, i++)
    Console.WriteLine(i);

int i = 0;
while (i < 10)
    Console.WriteLine(i);

int i = 0;
while (i < 10)
    Console.WriteLine(i);

for (int i = 0; i >= 10; i++)
    Console.WriteLine(i);

for (int i = 0; i >= 10; i++)
    Console.WriteLine(i);

do
    ...
    string line = Console.ReadLine( );
    guess = int.Parse(line);
while (guess != answer);

do
    ...
    string line = Console.ReadLine( );
    guess = int.Parse(line);
while (guess != answer);

2

2

2

2

3

3

3

3

4

4

4

4

1

1

1

1

background image

 Using Jump Statements

The goto Statement

The break and continue Statements

background image

The goto Statement

Flow of control transferred to a 

labeled statement

Can easily result in obscure 

“spaghetti” code

if (number % 2 == 0) goto Even;
Console.WriteLine("odd");
goto End;
Even:
Console.WriteLine("even");
End:;

if (number % 2 == 0) goto Even;
Console.WriteLine("odd");
goto End;
Even:
Console.WriteLine("even");
End:;

background image

The break and continue Statements

The break statement jumps out of an 

iteration

The continue statement jumps to the 

next iteration

int i = 0;
while (true) {
    Console.WriteLine(i);
    i++;
    if (i < 10) 
        continue;
    else
        break;
}

int i = 0;
while (true) {
    Console.WriteLine(i);
    i++;
    if (i < 10) 
        continue;
    else
        break;
}

background image

Lab 4.1: Using Statements

background image

 Handling Basic Exceptions

Why Use Exceptions?

Exception Objects

Using try and catch Blocks

Multiple catch Blocks

background image

Why Use Exceptions?

Traditional procedural error handling 

is cumbersome

int errorCode = 0;
FileInfo source = new FileInfo("code.cs");
if (errorCode == -1) goto Failed;
int length = (int)source.Length;
if (errorCode == -2) goto Failed;
char[] contents = new char[length];
if (errorCode == -3) goto Failed;
// Succeeded ...
Failed: ...

int errorCode = 0;
FileInfo source = new FileInfo("code.cs");
if (errorCode == -1) goto Failed;
int length = (int)source.Length;
if (errorCode == -2) goto Failed;
char[] contents = new char[length];
if (errorCode == -3) goto Failed;
// Succeeded ...
Failed: ...

Error handling

Error handling

Core program logic

Core program logic

background image

Exception Objects

Exception

Exception

SystemException

SystemException

OutOfMemoryException

OutOfMemoryException

IOException

IOException

NullReferenceException

NullReferenceException

ApplicationException

ApplicationException

background image

Using try and catch Blocks

Object-oriented solution to error 

handling 

Put the normal code in a try block

Handle the exceptions in a separate 

catch block

try {

Console.WriteLine("Enter a number");
int i = int.Parse(Console.ReadLine());

}
catch (OverflowException caught)
{

Console.WriteLine(caught);

}

try {

Console.WriteLine("Enter a number");
int i = int.Parse(Console.ReadLine());

}
catch (OverflowException caught)
{

Console.WriteLine(caught);

}

Error handling

Error handling

Program logic

Program logic

background image

Multiple catch Blocks

Each catch block catches one class of 

exception

A try block can have one general catch 

block

A try block is not allowed to catch a 

class that is derived from a class 

caught in an earlier catch block 

try 
{

Console.WriteLine("Enter first number");
int i = int.Parse(Console.ReadLine());
Console.WriteLine("Enter second number");
int j = int.Parse(Console.ReadLine());
int k = i / j;

}
catch (OverflowException caught) {…}
catch (DivideByZeroException caught) {…}

try 
{

Console.WriteLine("Enter first number");
int i = int.Parse(Console.ReadLine());
Console.WriteLine("Enter second number");
int j = int.Parse(Console.ReadLine());
int k = i / j;

}
catch (OverflowException caught) {…}
catch (DivideByZeroException caught) {…}

background image

 Raising Exceptions

The throw Statement

The finally Clause 

Checking for Arithmetic Overflow

Guidelines for Handling Exceptions

background image

The throw Statement

Throw an appropriate exception

Give the exception a meaningful 

message

throw expression ;

throw expression ;

if (minute < 1 || minute >= 60) {
  throw new InvalidTimeException(minute + 
                             " is not a valid minute");
  // !! Not reached !!
}

if (minute < 1 || minute >= 60) {
  throw new InvalidTimeException(minute + 
                             " is not a valid minute");
  // !! Not reached !!
}

background image

The finally Clause

All of the statements in a finally block 

are always executed

Monitor.Enter(x);
try {
    ...
}
finally {
    Monitor.Exit(x);
}

Monitor.Enter(x);
try {
    ...
}
finally {
    Monitor.Exit(x);
}

Any catch blocks are optional

Any catch blocks are optional

background image

Checking for Arithmetic Overflow

By default, arithmetic overflow is not 

checked

A checked statement turns overflow 

checking on

checked {
    int number = int.MaxValue;
    Console.WriteLine(++number);
}

checked {
    int number = int.MaxValue;
    Console.WriteLine(++number);
}

unchecked {
    int number = int.MaxValue;
    Console.WriteLine(++number);
}

unchecked {
    int number = int.MaxValue;
    Console.WriteLine(++number);
}

-2147483648

OverflowException

OverflowException

Exception object is 
thrown. WriteLine is 
not executed.

MaxValue + 1 is 
negative?

background image

Guidelines for Handling Exceptions

Throwing

Avoid exceptions for normal or expected cases 

Never create and throw objects of class 

Exception

Include a description string in an Exception 

object

Throw objects of the most specific class possible

Catching

Arrange catch blocks from specific to general

Do not let exceptions drop off Main

background image

Lab 4.2: Using Exceptions

background image

Review

Introduction to Statements

Using Selection Statements

Using Iteration Statements

Using Jump Statements

Handling Basic Exceptions

Raising Exceptions


Document Outline