This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
The compiler isn't smart enough to see that your two if-statements cover all possible cases. It's complaining that there might be a path through the method for which there is no return value specified.
The compiler checks your code, but the checks it can do are limited. Remember that it's just a program, not a human being that can think and reason itself out of any arbitrary complex situation.
*edit* I just thought of a possibility. Suppose that the variable weekday is being modified by another thread at the same time the above code is executing. The following might happen: The first if-statement is evaluated and it's false, so we go on to the second if-statement. At that moment, another thread modifies weekday, so that also the second if-statement evaluates to false. Now the method reaches a point where the return value isn't specified.