# Fehlercode



## fabfre (10. Dez 2012)

Hallo,
in diesem Code sollen 6 Fehler sein.


```
import java.util.Scanner ;
public class Aufgabe1 {
    public static void main (String x) {
         double [] d = methode1 ();
         methode2 (d);
         System.out.println(methode3 (d));
       }

     public static void methode1 () {
          Scanner s = new Scanner (System.in);
          double [] d;
          int i = 2;
          do {
             double d1 = s.nextDouble ();
             if (d1 < 0) {
                  d[i] = -d1;
             } else {
                  d[i] = d1;
             }
       } while (i-- > 0)
    return d;
}

      public static void methode2 (double [] d) {
           for (int i = 0; i < d.length + 1; i++) {
               for (int j = i + 1; j < d.length ; j++) {
                     if (d[i] > d[j]) {
                         d[i] += d[j];
                          d[j] = d[i] - d[j];
                          d[i] -= d[j];
                    }
              }
         }
   }

      public static String methode3 (double [] d) {

            for (int i = 0; i < d.length ; i++) {
                 s += d[i] + "\t";
         }
         return s;
    }
}
```

Ich habe bereits diese gefunden:
Zeile 3: fehlt [] nach String.
Zeile 9: muss double[] heißen, anstatt void.
Zeile 25: d.length - 1, anstatt +1.

Dann sehe ich noch in Zeile 20 und in Zeile 39 einen Fehler, aber weiß nicht wie diese verbessert gehören. Nach while(...) muss doch eigentlich eine geschweifte Klammer kommen, oder? Und wie wird dieses String s initalisiert? 
Ich danke euch schon einmal für eure Mühe :toll:
Fabi


----------



## Gonzo17 (10. Dez 2012)

In Zeile 20 müsste eine Meldung wie folgende kommen: 
	
	
	
	





```
Syntax error on token ")", ; expected after this token
```
Sagt eigentlich alles aus.

In Zeile 39 wird eine Variable 
	
	
	
	





```
s
```
 verwendet, die vorher nie deklariert wurde. Du könntest zum Beispiel vor der for-Schleife einfach 
	
	
	
	





```
String s = null;
```
 schreiben.


----------



## Landei (10. Dez 2012)

Es gibt nicht nur [c]while(...) {...}[/c], sondern auch [c]do { ... } while(...)[/c]. In methode3 sollte Zeile 39 korrekt sein (String-"Addition" ist besonders, weil vorher andere Typen automatisch umgewandelt werden), aber s ist nirgendwo definiert: In Zeile 37 gehört also etwas wie [c]String s = "";[/c].


----------



## Landei (10. Dez 2012)

Gonzo17 hat gesagt.:


> Du könntest zum Beispiel vor der for-Schleife einfach
> 
> 
> 
> ...


... was in Zeile 39 zu einer Nullpointer-Exception führt


----------



## Gonzo17 (10. Dez 2012)

Landei hat gesagt.:


> ... was in Zeile 39 zu einer Nullpointer-Exception führt



Wie kommst du denn darauf?

Aber unabhängig davon wäre es günstiger nicht mit 
	
	
	
	





```
null
```
 zu initialisieren oder gleich nen [JAPI]StringBuilder[/JAPI] zu nehmen.


----------



## Trolllllll (10. Dez 2012)

Gonzo17 hat gesagt.:


> Wie kommst du denn darauf?



Da du 
	
	
	
	





```
String s = null;
```
 geschrieben hattest, wenn man dann darauf mit 
	
	
	
	





```
+=
```
 zugreifen will, gibt es die null-Pointer exception, da die Variable s nach null zeigt, richtig wäre 
	
	
	
	





```
String s = "";
```
 wie schon erwähnt wäre. Würde in Zeile 39 nur 
	
	
	
	





```
s=...
```
 stehen würde es so gehen, wie du es beschrieben hast.


----------



## Bernd Hohmann (10. Dez 2012)

Zeile  3: public static void main(String x[]) (main erwartet ein String-Array sonst wird es nicht erkannt)
Zeile  9: public static double[] methode1 ()
Zeile 11: double[] d=new double[3]; (es fehlte die Initialisierung)
Zeile 20: 	} while (i-- > 0); (abschliessendes Semikolon)
Zeile 25: for (int i = 0; i < d.length - 1; i++) {
Zeile 37: String s = "";

Bernd


----------



## Gonzo17 (10. Dez 2012)

```
public class Test {
	public static void main(String[] args) {
		String s = null;
		for (int i = 0; i < 10; i++) {
			s += i + "/";
		}
		System.out.println(s);
	}
}
```


```
null0/1/2/3/4/5/6/7/8/9/
```

Also ja, unerwartetes Ergebnis. Aber nein, keine NullPointerException. Deswegen eben besser mit leerem String initialisieren oder gleich StringBuilder.


----------



## Trolllllll (10. Dez 2012)

Ok, damit hätte ich wirklich nicht gerechnet, ich hätte eher wie ja schon geschrieben die nullPointerException erwahrtet.
Aber ja generell sollte man einen String immer mit 
	
	
	
	





```
=""
```
 initialisieren


----------



## Bernd Hohmann (10. Dez 2012)

> Also ja, unerwartetes Ergebnis.



So unerwartet ist das gar nicht da das Anhängen eines "null" Objektes bei Strings schon immer den Text "null" gebracht hat.


```
Object o = null;
System.out.println("A" + o + "B");
System.out.println("A" + null + "B");
```


```
AnullB
AnullB
```

Da gibt es viele Stellen in der Runtime, die das organisieren:

String:

```
public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
```

AbstractStringBuilder (früher StringBuffer):

```
public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";

    public AbstractStringBuilder append(StringBuffer sb) {
        if (sb == null) return append("null");

    public AbstractStringBuilder append(CharSequence s) {
        if (s == null) s = "null";
```

usw..

Bernd


----------



## Gonzo17 (10. Dez 2012)

Das wusste ich vorher nicht, daher unerwartet, danke für die Erklärung


----------



## Landei (11. Dez 2012)

Ich hatte irgendwie sowas im Hinterkopf...

```
Double x = null;
Double y = 42.0;
Double z = x + y; //Peng!
```
... aber Strings bekommen ja eine Extrabratwurst gebraten - als hätte null eine toString()-Methode.


----------



## Bernd Hohmann (11. Dez 2012)

Landei hat gesagt.:


> ... aber Strings bekommen ja eine Extrabratwurst gebraten - als hätte null eine toString()-Methode.



Das liegt in der Natur von primitiven Datentypen.

Aber ohne diese Extrawurst könnten wir zu viele Debugausgaben mitsamt den Debuggern auf den Müll werfen.

Oder prüfst in deinem .toString() wirklich jedes Objekt ob es wirklich "null" ist ehe Du den String zusammenklebst? 

Bernd


----------



## Landei (11. Dez 2012)

Ich versuche zumindest, null wie die Pest zu meiden...


----------

