Variablendeklarationen sind keine normalen Anweisungen

Eine Deklaration macht für uns den Eindruck, dass wir sie an jeder Stelle einsetzen können, wo auch eine Anweisung stehen kann. Dass dies nicht korrekt ist, zeigt das folgende Beispiel:

if ( true )
  int m = 1;

Auf den ersten Blick sieht dies korrekt aus, der Compiler meldet jedoch einen Fehler. Hinter einer Fallanweisung (und auch Schleife) muss eine Anweisung stehen und Deklarationen sind keine einfachen Anweisungen. Dies zeigt auch die Sprachdefinition – ein Ausschnitt.

Statement:
Block
if ParExpression Statement [else Statement]
ExpressionStatement

Betrachten wir eine normale if-Anweisung, dann muss ein Statement folgen, welches zum Beispiel ein weiteres Statement ist, oder ein ExpressionStatement. Dies ist jedoch, wie betont, keine Variablendeklaration. Retten können wir dies, indem wir einen Block einführen.

if ( true )
{
  int m = 1;
}

Dies ist für uns nichts unbekanntes mehr. Doch vergewissern wir uns noch einmal in der Sprachreferenz: 

Block:
{ BlockStatements }
BlockStatements:
{ BlockStatement }
BlockStatement :
LocalVariableDeclarationStatement
ClassOrInterfaceDeclaration
[Identifier :] Statement

In einem Block erkennen wir an LocalVariableDeclarationStatement die Möglichkeit, Variablen zu deklarieren. Danach sind wieder beliebige Statement Einträge erlaubt.

Ob dieses nun sinnig ist oder nicht bleibt eine erlaubte Frage. Da die Variable nach der Definition in der Zeile sowieso ungültig ist, macht die Deklaration keinen Sinn. Allerdings könnte sie Nebeneffekte haben, dass sie zum Beispiel eine Klassenvariable setzt oder ein Funktionsaufruf weitere spannende Sachen macht.