Previous
Index

Next

Chapter 2) Flow control and exception Handling

Objective 1, The if and switch statements

Write code using if and switch statements and identify legal argument types for these statements.

If/else statements

If/else constructs in Java are just as you might expect from other languages. switch/case statements have a few peculiarities.

The syntax for the if/else statement is 

if(boolean condition){ 
        //the boolean was true so do this 
        }else { 
        //do something else 
}



Java does not have a "then" keyword like the one in Visual Basic. 

The curly braces are a general indicator in Java of a compound statement that allows you to execute multiple lines of code as a result of some test. This is known as a block of code. The else portion is always optional. You can chain multiple if/else statements as follows (though after a couple you might want to consider the case construct instead).


int i=1;
    if(i==1){
        //some code 
    } else if (i==2){
        //some code
    } else{
        //some code
    }


One idiosyncrasy of the Java if statement is that it must take a boolean value. You cannot use the C/C++ convention of any non zero value to represent true and 0 for false.

Thus in Java the following will simply not compile

int k =-1; 
        if(k){//Will not compile! 
        System.out.println("do something"); 
}

because you must explicitly make the test of k return a boolean value, as in the following example

if(k == -1){ 
    System.out.println("do something"); //Compiles OK! 
    } 

As in C/C++ you can miss out the curly brackets thus

boolean k=true;
if(k)
System.out.println("do something");

This is sometimes considered bad style, because if you modify the code later to include additional statements they will be outside of the conditional block. Thus

if(k) 
        System.out.println("do something"); 
        System.out.println("also do this");



The second output will always execute.

Switch statements

Peter van der Lindens opinion of the switch statement is summed up when he says

"death to the switch statement"

Thus this is a subject you should pay extra attention to. The argument to a switch statement must be a byte, char, short or int. You might get an exam question that uses a float or long as the argument to a switch statement.. A fairly common question seems to be about the use of the break statement in the process of falling through a switch statement. Here is an example of this type of question. 

int k=10; 
switch(k){
        case 10: 
                System.out.println("ten"); 
        case 20: 
                System.out.println("twenty"); 
        }



Common sense would indicate that after executing the instructions following a case statement, and having come across another case statement the compiler would then finish falling through the switch statement. However, for reasons best known to the designers of the language case statements only stop falling through when they come across a break statement. As a result, in the above example both the strings ten and twenty will be sent to the output.


Another little peculiarity that can come up on questions is the placing of the default statement.

The default clause does not need to come at the end of a case statement

The conventional place for the default statement is at the end of of case options. Thus normally code will be written as follows

int k=10; 
switch(k){
        case 10: 
                System.out.println("ten"); 
                break; 
        case 20: 
                System.out.println("twenty"); 
                break; 
        default: 
                System.out.println("This is the default output"); 
}



This approach mirrors the way most people think. Once you have tried the other possibilities, you perform the default output. However, it is syntactically correct, if not advisable, to code a switch statement with the default at the top

int k=10; 
    switch(k){ 
    default: //Put the default at the bottom, not here
        System.out.println("This is the default output"); 
        break; 
    case 10: 
        System.out.println("ten"); 
        break; 
    case 20: 
        System.out.println("twenty"); 
        break; 
}
       

Legal arguments for if and switch statements

As mentioned previously an if statement can only take a boolean type and a switch can only take a byte, char, short or int. 

The ternary ? operator

Some programmers claim that the ternary operator is useful. I do not consider it so. It is not specifically mentioned in the objectives so please let me know if it does come up in the exam.

Other flow control statements

Although the published objectives only mention the if/else and case statements the exam may also cover the do/while and the while loop.

Exercises.

Exercise 1

Create a file with a public class called IfElse. Create a method called go that takes the args String array from the main method. In that method create an if/else block that looks at the first element of the array and uses the String equals method to determine the output. If it contains “true” print out “ok” and if false output “Not Ok”, if it contains a string other than true or false print out “Invalid command parameter”. Use a single sequence of if/else if/else statements.

Exercise 2

Modify the IfElse class so that an if statement checks to see if the String array passed to the go method has a length of zero using the array length field. If the length is zero output the string “No parameter supplied”. Place the existing if/else if/else block within the else block of this test, so it acts as in the original version.



Suggested Solution to Exercise 1

public class IfElse{
    public static void main(String argv[]){
        IfElse ie = new IfElse();
        ie.go(argv);
    }
    public void go(String[] sa){
    String s = sa[0];
    if(s.equals("true")){
        System.out.println("OK");
    }else if(s.equals("false")){
        System.out.println("Not OK");
    }else{
        System.out.println("Invalid command parameter");
    }
    }

}
       

Suggested Solution to Exercise 2

public class IfElse{
    public static void main(String argv[]){

        IfElse ie = new IfElse();
        ie.go(argv);

    }
    public void go(String[] sa){
    if(sa.length ==0){
        System.out.println("No parameter supplied");
    }else{
        String s = sa[0];
        if(s.equals("true")){
        System.out.println("OK");
        }else if(s.equals("false")){
        System.out.println("Not OK");
        }else{
        System.out.println("Invalid command parameter");
        }
    }

    }
}

    
   

Questions

Question 1)

What will happen when you attempt to compile and run the following code?

public class MyIf{
boolean b;
public static void main(String argv[]){
 MyIf mi = new MyIf();
}

MyIf(){
        if(b){
            System.out.println("The value of b was true");
            }
            else{
            System.out.println("The value of b was false");
            }
    }
}

1) Compile time error variable b was not initialised
2) Compile time error the parameter to the if operator must evaluate to a boolean
3) Compile time error, cannot simultaneously create and assign value for boolean value
4) Compilation and run with output of false



Question 2)

What will happen when you attempt to compile and run this code?

public class MyIf{
public static void main(String argv[]){
     MyIf mi = new MyIf();
    }
MyIf(){
    boolean b = false;
    if(b=false){
        System.out.println("The value of b is"+b);
        }
    }
}

1) Run time error, a boolean cannot be appended using the + operator
2) Compile time error the parameter to the if operator must evaluate to a boolean
3) Compile time error, cannot simultaneously create and assign value for boolean value
4) Compilation and run with no output


Question 3)


What will happen when you attempt to compile and run this code?

public class MySwitch{
public static void main(String argv[]){
    MySwitch ms= new MySwitch();
    ms.amethod();
    }

public void amethod(){
    char k=10; 
        switch(k){ 
        default: 
            System.out.println("This is the default output"); 
            break; 
         case 10: 
            System.out.println("ten");
            break;
         case 20: 
            System.out.println("twenty"); 
        break; 
       }
    }
}



1) None of these options
2) Compile time error target of switch must be an integral type
3) Compile and run with output "This is the default output"
4) Compile and run with output "ten"


Question 4)

What will happen when you attempt to compile and run the following code?

public class MySwitch{
public static void main(String argv[]){
    MySwitch ms= new MySwitch();
    ms.amethod();
    }


public void amethod(){
    int k=10; 
        switch(k){ 
        default: //Put the default at the bottom, not here
            System.out.println("This is the default output"); 
            break; 
         case 10: 
            System.out.println("ten");
         case 20: 
            System.out.println("twenty"); 
        break; 
       }
    }
}



1) None of these options
2) Compile time error target of switch must be an integral type
3) Compile and run with output "This is the default output"
4) Compile and run with output "ten"


Question 5)

Which of the following could be used as the parameter for a switch statement?

1) byte b=1;
2) int i=1;
3) boolean b=false;
4) char c='c';

Answers

Answer 1)

4) Compilation and run with output of false

Because the boolean b was created at the class level it did not need to be explicitly initialised and instead took the default value of a boolean which is false. An if statement must evaluate to a boolean value and thus b meets this criterion.

Answer 2)

4) Compilation and run with no output

Because b is a boolean there was no error caused by the if statement. If b was of any other data type an error would have occurred as you attempted to perform an assignment instead of a comparison. The expression

if(b=false)

would normally represent a programmer error. Often the programmer would have meant to say

if (b==false)

If the type of b had been anything but boolean a compile time error would have resulted. The requirement for the if expression is that it return a boolean and because

(b=false )

does return a boolean it is acceptable (if useless).

Answer 3)

4) Compile and run with output "ten"

Answer 4)

1) None of these options

Because of the lack of a break statement after the

break 10;

statement the actual output will be

"ten" followed by "twenty"

Answer 5)

1) byte b=1;
2) int i=1;
4) char c='c';

A switch statement can take a parameter of byte, char, short or int.



Other sources on this topic

The Sun tutorial
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/while.html


Central Connecticut State University

http://chortle.ccsu.ctstateu.edu/cs151/Notes/chap12/ch12_1.html

Jyothi Krishnan on this topic at
http://www.geocities.com/SiliconValley/Network/3693/obj_sec2.html#obj5

Bruce Eckel, Thinking in Java
http://codeguru.earthweb.com/java/tij/tij0045.shtml




Previous
Index

Next