why do they assign a null parameter here:
Code:
 outputLine = kkp.processInput(null);


Code:
import java.net.*; 
import java.io.*; 
  
public class KKMultiServerThread extends Thread { 
    private Socket socket = null; 
  
    public KKMultiServerThread(Socket socket) { 
    super("KKMultiServerThread"); 
    this.socket = socket; 
    } 
  
    public void run() { 
  
    try { 
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
        BufferedReader in = new BufferedReader( 
                    new InputStreamReader( 
                    socket.getInputStream())); 
  
        String inputLine, outputLine; 
        KnockKnockProtocol kkp = new KnockKnockProtocol(); 
        outputLine = kkp.processInput(null); 
        out.println(outputLine); 
  
        while ((inputLine = in.readLine()) != null) { 
        outputLine = kkp.processInput(inputLine); 
        out.println(outputLine); 
        if (outputLine.equals("Bye")) 
            break; 
        } 
        out.close(); 
        in.close(); 
        socket.close(); 
  
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
    }
also, why in this next one do they add the minus one. That would make it 4.

Code:
 if (currentJoke == (NUMJOKES - 1))
Code:
import java.net.*;
import java.io.*;

public class KnockKnockProtocol {
    private static final int WAITING = 0;
    private static final int SENTKNOCKKNOCK = 1;
    private static final int SENTCLUE = 2;
    private static final int ANOTHER = 3;

    private static final int NUMJOKES = 5;

    private int state = WAITING;
    private int currentJoke = 0;

    private String[] clues = { "Turnip", "yodel", "Ach", "who", "who" };
    private String[] answers = { "Turnip the heat, it's cold in here!",
                                 "I didn't know you could yodel!",
                                 "Bless you!",
                                 "Is there an owl in here?",
                                 "Is there an echo in here?" };

    public String processInput(String theInput) {
        String theOutput = null;

        if (state == WAITING) {
            theOutput = "Knock! Knock!";
            state = SENTKNOCKKNOCK;
        } else if (state == SENTKNOCKKNOCK) {
            if (theInput.equalsIgnoreCase("Who's there?")) {
                theOutput = clues[currentJoke];
                state = SENTCLUE;
            } else {
                theOutput = "You're supposed to say \"Who's there?\"! " +
			    "Try again. Knock! Knock!";
            }
        } else if (state == SENTCLUE) {
            if (theInput.equalsIgnoreCase(clues[currentJoke] + " who?")) {
                theOutput = answers[currentJoke] + " Want another? (y/n)";
                state = ANOTHER;
            } else {
                theOutput = "You're supposed to say \"" + 
			    clues[currentJoke] + 
			    " who?\"" + 
			    "! Try again. Knock! Knock!";
                state = SENTKNOCKKNOCK;
            }
        } else if (state == ANOTHER) {
            if (theInput.equalsIgnoreCase("y")) {
                theOutput = "Knock! Knock!";
                if (currentJoke == (NUMJOKES - 1))
                    currentJoke = 0;
                else
                    currentJoke++;
                state = SENTKNOCKKNOCK;
            } else {
                theOutput = "Bye.";
                state = WAITING;
            }
        }
        return theOutput;
    }
}