Fehlercode

fabfre

Neues Mitglied
Hallo,
in diesem Code sollen 6 Fehler sein.

Java:
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
 
In Zeile 20 müsste eine Meldung wie folgende kommen:
Code:
Syntax error on token ")", ; expected after this token
Sagt eigentlich alles aus.

In Zeile 39 wird eine Variable
Code:
s
verwendet, die vorher nie deklariert wurde. Du könntest zum Beispiel vor der for-Schleife einfach
Code:
String s = null;
schreiben.
 
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].
 
Wie kommst du denn darauf?

Da du
Code:
String s = null;
geschrieben hattest, wenn man dann darauf mit
Code:
+=
zugreifen will, gibt es die null-Pointer exception, da die Variable s nach null zeigt, richtig wäre
Code:
String s = "";
wie schon erwähnt wäre. Würde in Zeile 39 nur
Code:
s=...
stehen würde es so gehen, wie du es beschrieben hast.
 
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
 
Java:
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);
	}
}

Code:
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.
 
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
Code:
=""
initialisieren
 
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.

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

Code:
AnullB
AnullB

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

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

AbstractStringBuilder (früher StringBuffer):
Java:
    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
 
Ich hatte irgendwie sowas im Hinterkopf...
Java:
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.
 
... 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
 

Zurück
Oben