# Variable nicht initialisiert <= Warum?



## Cossi (10. Aug 2006)

Hallo zusammen,

ich habe einen Java-Chat, der soweit auch bestens läuft. Nun kennt man ja aus diversen Chats die Funktion, dass man einen User, der viel Müll redet, oder spamt auch mal "knebeln" muss/will. Die Funktion hierfür ist bereits vorhanden und funktioniert auch reibungslos.
Bei längeren Usernamen im Chat ist es jedoch mühseelig und zeitaufwendig, wenn man erst den kompletten Usernamen eingeben muss, damit der Befehl auch wirklich greift, aus diesem Grunde wollte ich eine sogenannte "+-Funktion" einbauen. Diese soll bewerkstelligen, dass man nur die ersten Buchstaben des betreffenden Usernamens eingeben muss und sich der Chat automatisch den betreffen Usernamen aus der Liste der im Raum anwesenden User raussucht und diesen dann "knebelt".
Die Funktion als solches ist (eigentlich) kein Problem. Wenn ich jedoch dann ans compilieren gehe, sagt er mir auf einmal, dass eine bestimmte Variable nicht initialisiert werden konnte/wurde. Kann mir jemand eine kleine Hilfestellung oder einen Lösungsansatz geben? Bin für jeden noch so kleinen Tip dankbar.

Hier mal der betreffende Code-Schnipsel (die Variable, welche es betrifft ist "othernick"):


```
private void cmd_gag(String input)
	{
		if(user.isAway())
			back();
		String othernick;
		String msg;
		if(user.getRights() < Integer.parseInt((String)root.config.rightshash.get("gag")))
		{
			user.println(String.valueOf(mustSU));
		} else
		{
//Beginn der sogenannten "+-Funktion"
            if(input.indexOf("+") != -1)
            {
                RoomThread r=user.getRoom("thread");
                String s2 = input.substring(0, input.indexOf("+"));
                String s3 = "";
                for(Enumeration listuser = r.elements();listuser.hasMoreElements();)    
                {
                    String s6 = (String)listuser.nextElement();
                    if(s6.startsWith(s2))
                        othernick = s6;
                }
                 msg = null;
            }
//Ende der Funktion
            else
			if(input.indexOf(" ") != -1)
			{
				othernick = input.substring(0, input.indexOf(" "));
				msg = input.substring(input.indexOf(" ")+1, input.length());
				
				msg=FontTags(msg);
				try
				{
					msg=replaces(msg);
				}
				catch(Exception ex){}
				if(msg.indexOf(":") >= 0) msg = srchsmil(msg);
			}
			else
			{
				othernick = input;
				msg = null;
			}
			user1 = root.getUser(othernick);
			String startgag = "";
			String stopgag = "";
			String meldung = "0";
			if(nickname.toUpperCase().equals(othernick.toUpperCase()) && !user.isGag())
				meldung = "2";
			else
			if(nickname.toUpperCase().equals(othernick.toUpperCase()) && user.isGag())
			{
				user.println("[i][b]Du kannst dich nicht selbst befreien![/b][/i]
");
				return;
			} else
			if(user1 != null && user1.isVisible())
			{
				if(user1.getRoom().equals(user.getRoom()))
				{
					if(!user1.isGag())
					{
						if(user1.getSecureRights() >= Integer.parseInt((String)root.config.rightshash.get("gagsecure")) && user.getRights() < Integer.parseInt((String)root.config.rightshash.get("gagsecure1")))
						{
							user.println("[i][b]Superuser können nicht geknebelt werden[/i][/b]
");
						} else
						{
							if(msg !=null)
							{
								startgag = root.config.getText("gagsMsg");
								startgag=startgag.replaceAll("<\\?words\\?>", msg);
							} else
							{
								startgag = root.config.getText("gags");
							}
							startgag = startgag.replaceAll("<\\?name2\\?>", "<font color=\"" + user1.getColor() + "\">" + user1.getName() + "</font>");
							startgag = startgag.replaceAll("<\\?name\\?>", "<font color=\"" + user.getColor() + "\">" + " " + nickname + "</font>");
							user.roomPrint(startgag);
							user1.setGag(true);
						}
					} else
					{						
						if(msg !=null)
						{
							stopgag = root.config.getText("rgagsMsg");
							stopgag = stopgag.replaceAll("<\\?words\\?>", msg);
						} else
						{
							stopgag = root.config.getText("rgags");
						}
						stopgag = stopgag.replaceAll("<\\?name2\\?>", "<font color=\"" + user1.getColor() + "\">" + user1.getName() + "</font>");
						stopgag = stopgag.replaceAll("<\\?name\\?>", "<font color=\"" + user.getColor() + "\">" + " " + nickname + "</font>");
						user.roomPrint(stopgag);
						user1.setGag(false);
					}
					meldung = "1";
				} else
				{
					meldung = "3";
				}
			} else
			{
				meldung = "0";
			}
			if(meldung.equals("0"))
				user.println(nothere(othernick));
			if(meldung.equals("2"))
				user.println("[i][b]Masochistisch veranlagt? ;)[/b][/i]
");
			if(meldung.equals("3"))
				user.println("[i][b]" + user1.getName() + " befindet sich nicht in diesem Raum![/b][/i]
");
		}
	}
```

Der Fehler wird dann auf Zeile 46 bezogen angezeigt.

Vielen Dank im Voraus.


----------



## Lim_Dul (10. Aug 2006)

```
//Beginn der sogenannten "+-Funktion"
            if(input.indexOf("+") != -1)
            {
                RoomThread r=user.getRoom("thread");
                String s2 = input.substring(0, input.indexOf("+"));
                String s3 = "";
                for(Enumeration listuser = r.elements();listuser.hasMoreElements();)   
                {
                    String s6 = (String)listuser.nextElement();
                    if(s6.startsWith(s2))
                        othernick = s6;
                }
                 msg = null;
            } 
//Ende der Funktion
```
In diesem Block wird die Variable othernick nicht initialisiert.

Du hast nämlich eine if Bedingung mit 3 Fällen:

Fall 1: Zeile 14-25
Fall 2: Zeile 29-40
Fall 3: Zeile 42-45

Und in Fall 1 wird othernick nicht initialisiert.


----------



## Cossi (10. Aug 2006)

Hm...
erstmal danke, dass sich jemand mal gemeldet hat.. )
Aber, entweder habe ich gerade n riesen Brett vorm Kopf oder ich schiele gerade... In Zeile 22 (Bei Deiner Antwort zeile 12) wird es doch initialisiert => othernick = s6;

*kopf kratz*

ich weiss im Moment echt nicht mehr weiter..


----------



## AlArenal (10. Aug 2006)

Und wenn dein Code nicht so grausig eingerückt wäre, hätte ich dir das auch gesagt. Ich war aber zu faul nen ganz genauen Bick draufzuwerfen....

Vielleicht solltest du ne Runde in Python programmieren?


----------



## Redfrettchen (10. Aug 2006)

Hi,
benutzt du keine IDE oder ist dein Einrückungsstil absichtlich so inkonsequent? (auch der Codestil ist eher zum Abgewöhnen, aber das nur nebenbei)

In deiner If-Verzweigung, die bei deinem Kommentar beginnt, gibt es drei Zweige: if, else if und else. In jedem steht zwar was von othernick da, aber im if-Zweig steht die Variablenzuweisung nach einer if-Verzweigung der nächsttieferen Stufe, die nur *vielleicht* genommen wird, deshalb wird der Variablen auch nur vielleicht was zugewiesen. Das ist dem Compiler aber zu vage, deshalb gibts einen Compilerfehler.

Also kontextbezogen würde ich sagen, dass du entweder der Variable einen Startwert zuweist (zum Beispiel null) und nach der for-Schleife prüfst, ob sich der Wert geändert hat, oder den else-Zweig sozusagen vorziehst, also die Anweisung darin vor die Verzweigung setzt und den Zweig löschst.

Also entweder:

```
String othernick = null;
...
if (...) {
    // kritische for-Schleife, othernick könnte immer noch null sein
    for (...) {
       ...
    }

    if (othernick==null) {
        othernick=input;
    }
} else if {
    ...
} else {
    ...
}
```

oder:

```
String othernick = input;
String msg = null;
if (...) {
    ...
} else if {
    ...
}
```

wobei zweiteres natürlich chicer ist.


----------



## Lim_Dul (10. Aug 2006)

Cossi hat gesagt.:
			
		

> Hm...
> erstmal danke, dass sich jemand mal gemeldet hat.. )
> Aber, entweder habe ich gerade n riesen Brett vorm Kopf oder ich schiele gerade... In Zeile 22 (Bei Deiner Antwort zeile 12) wird es doch initialisiert => othernick = s6;
> 
> ...



Nur wenn die for-Schleife tatsächlich durchlaufen wird. Und das weiß der Compiler nicht.


----------



## Redfrettchen (10. Aug 2006)

Lim_Dul hat gesagt.:
			
		

> Cossi hat gesagt.:
> 
> 
> 
> ...


Stimmt, das kommt auch noch dazu, die Schleife selbst könnte ja auch nicht durchlaufen werden. Aber das ändert nichts an den Lösungsvorschlägen.


----------

