erstes Prog./Klasse - Konstruktur/Objekterstellung funktioniert nicht

joey9

Mitglied
Hallo - bin neu hier und starte grade mit java; versuche mich schon länger am ersten Programm, was aber nicht funktioniert - sorry schonmal für den langen Post, für Hilfe wäre ich dankbar, habe schon ziemlich viel versucht (google, FAQs hier... als letztes am Ende des Konstruktors 'this.maxGewicht = maxGewicht;...' eingefügt, was das Problem auch nicht behoben hat).
Hier erstmal mein Code-Auszug:
Java:
public class Flugzeug 
{ 
    // Attribute: 
    private double maxGewicht, leerGewicht, ladungGewicht, reiseGeschw, flugStunden, verbrauch, tankKapazitaet, kerosinVorrat; 
    
    // Methoden: 
    // Konstruktoren 
    
    public Flugzeug(double maxGewicht, double leerGewicht, double ladungGewicht, double reiseGeschw, double flugStunden, double verbrauch, double tankKapazitaet, double kerosinVorrat)
    { 
        if (maxGewicht < 2)
        {
            maxGewicht = 2;
        }
        if (leerGewicht < 1)
        {
            leerGewicht = 1;
        }
        if (ladungGewicht < 0)
        {
            ladungGewicht = 0;
        }
        if (reiseGeschw < 1)
        {
            reiseGeschw = 1;
        }
        if (flugStunden < 0)
        {
            flugStunden = 0;
        }
        if (verbrauch < 1)
        {
            verbrauch = 1;
        }
        if (tankKapazitaet < 1)
        {
            tankKapazitaet = 1;
        }
        if (kerosinVorrat < 0)
        {
            kerosinVorrat = 0;
        }
        kerosinVorrat = kerosinVorrat > tankKapazitaet ? tankKapazitaet : kerosinVorrat;
    } 
    // -->zwischendrin hab ich dann methoden wie z.b.: 'public void info ()' ...
        public static void main(String[] arguments)
    {
        // Instanzieren des Objekts albatros
        Flugzeug albatros = new Flugzeug(70000, 35000, 10000, 800, 500, 2500, 25000, 8000);
        albatros.info();
        System.out.println("Laden : 1500");
        albatros.laden(1500);
        albatros.info();
        System.out.println("Fliegen : 3000");
        albatros.fliegen(3000);
        albatros.info();
        System.out.println("Tanken : 10000");
        albatros.tanken(10000);
        albatros.info();
        System.out.println("Fliegen : 3000");
        albatros.fliegen(3000);
        albatros.info();
    }		
}
-->hier die Fehlermeldungen beim Ausführen bzw. vom Auswertungsserver:
C:\temp>javac Flugzeug.java
C:\temp>cd..
C:\>java temp.Flugzeug
Exception in thread "main" java.lang.NoClassDefFoundError: temp/Flugzeug (wrong name: Flugzeug)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: temp.Flugzeug. Program will exit.
Fehlermeldung im Testprogramm:
Testgruppe: Konstruktoren und Getter
Dieser Testabschnitt überprüft den Konstruktor und die Zugriffsmethoden der Klasse Flugzeug
Beschreibung Test des Konstruktors und der Zugriffsmethoden mit typischen Werten.
Ergebnis Test aufgrund eines gefunden Fehlers fehlgeschlagen!
Fehler Es wird folgendes Flugzeug-Objekt angelegt: Flugzeug(70000.0, 35000.0, 10000.0, 800.0, 500.0, 2500.0, 25000.0, 8000.0)
Das maximale Startgewicht wird nicht richtig initialisiert oder von der entsprechenden Zugriffsmethode falsch zurückgegeben. Nach der Initialisierung muss das maximale Startgewicht 70000.0 kg betragen. Nach dem Konstruktoraufruf gibt Ihre Gettermethode ein maximales Startgewicht von 0.0 kg zurück.

-->>ausserdem habe ich folgende Vorgabe:
Beim manuellen Testen Ihrer eigenen Lösungen wird die main-Methode zur Initialisierung und Ausführung genutzt.Diese Methode wird vom Auswertungs-Server gänzlich ignoriert,daher muss die komplette Funktionalität ausserhalb der main-Methode implementiert werden.
-->hierzu hatte ich erst eine Ersatzmethode eingebaut, welche ich über die Main-Methode aufrufen wollte - jedoch hab ich die lt. einem Ratschlag wieder entfernt. Was ist damit gemeint und wie kann ich das umsetzen?

Nochmal sorry für das lange Post und vielen Dank für Vorschläge/ Hilfen.
 
>java temp.Flugzeug

Des heisst, dass das Flugzeug im Package temp ist, was es aber nicht ist.
Code:
package temp;
als erste Zeile in der Klasse

EDIT:
als Beispiel
Java:
package temp;

public class Foo {

	public static void main(String[] args) {
		System.out.println("BLUB");
	}
}

Code:
/src/temp$ javac Foo.java 
/src/temp$ cd ..
/src$ java temp.Foo
BLUB
/src$
 
Zuletzt bearbeitet:
Das Java Problem muss von anderen gelöst werden, ich habe Eclipse und kann dir da nicht helfen, aber ein Problem mit deinem Code ist, dass deine lokalen Variablen gleich heissen wie die Parameter - da weiss du ja nie was du mit maxGewicht meinst! Es empfiehlt sich unterschiedliche Namen zu wählen - ich mach bei Parametern ein führendes p und bei Members ein m vorne hin, aber das ist Geschmackssache - nur unterschiedlich sollen die schon sein.

Na ja, ob mein Code in deinem Sinn ist, weiss ist nicht, aber der kompiliert und macht mal etwas halbwegs vernünftiges ;-)

Java:
public class Flugzeug {

	// Attribute: 
	private double mMaxGewicht, mLeerGewicht, mLadungGewicht, mReiseGeschw, mFlugStunden, mVerbrauch, mTankKapazitaet, mKerosinVorrat;

	// Methoden: 
	// Konstruktoren 

	public Flugzeug(double pMaxGewicht, double pLeerGewicht, double pLadungGewicht,
			double pReiseGeschw, double pFlugStunden, double pVerbrauch,
			double pTankKapazitaet, double pKerosinVorrat)
	{
		if (pMaxGewicht < 2) {
			mMaxGewicht = 2;
		} else {
			mMaxGewicht = pMaxGewicht;
		}
		if (pLeerGewicht < 1) {
			pLeerGewicht = 1;
		} else {
			mLeerGewicht = pLeerGewicht;
		}
		// den Rest kannst du selbst machen
	}

	public String toString() {
		return "maxGewicht = " + mMaxGewicht;
	}

	public static void main(String[] arguments) {
		Flugzeug mFlugzeug = new Flugzeug(999,222,555,444,100,60,700,500);
		System.out.println(mFlugzeug);
	}

}
Output:
Code:
maxGewicht = 999.0
 
Zuletzt bearbeitet:
Ein Problem sind mal, dass deine lokalen Variablen gleich heissen wie die Parameter - da weiss du ja nie was du mit maxGesicht meinst! Es empfiehlt sich unterschiedliche Namen zu wählen - ich mach bei Parametern ein führendes p und bei Members ein m vorne hin, aber das ist Geschmackssache - nu unterschiedlich sollen die schon sein.
im Prinzip richtig was du sagst aber leider falsch erklärt.

In Java nutzen wir keine präfixe (m_, p_, etc. pp.), das widerspricht den Codekonventionen von Java 😉
Es würde reichen, vor die Parameter ein final zu schreiben, die Namen können gleich bleiben 😉
 
>die Parameter ein final zu schreiben, die Namen können gleich bleiben

Ich bin da eher ein thisser... (
Code:
this.blub = blub
)
 
Vielleicht benutz IHR das nicht, aber ich habe das in der FH während dem ganzen NDS nie anders gesehen - bei keinem der Dozenten. (Das war meine erste Begenungn mit Java, aber aus 15 Jahren Erfahrung mit allen möglichen sprachen weiss ich: Gleich Namen sind definitv tabu, denn das erschwert die Wartbarkeit des Codes massiv!)
 
Ihr macht es wohl so, aber ich finde das schlecht leserlich.
Und wozu es führen kann haben wir ja gesehen - also lieber andere Namenwählen

this.value = StringValue.from(value);
Was ist "value"? eine lokale Variable? ein Parameter? -> wenn hier pValue steht ist es doch klarer.

this.count = size; -> unterschiedliche Namen - ok, aber betreffend "size" -> gleiche Fragen wie oben

Java:
    private final char value[];

    public String(char value[]) {
	this.offset = 0;
	this.count = value.length;
	this.value = StringValue.from(value);
    }

    public String(String original) {
	int size = original.count;
	char[] originalValue = original.value;
	char[] v;
  	if (originalValue.length > size) {
            int off = original.offset;
            v = Arrays.copyOfRange(originalValue, off, off+size);
 	} else {
	    v = originalValue;
 	}
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

Aber wie gesagt - anders gelernt - jetzt andere Codier-Richtlinien
 
hallo!

danke euch für die infos!!!
100%ig hab ichs noch nicht:
also vorschlag von maki ein final davor, damit das lokal ist und bleibt wie
public Flugzeug(final double maxGewicht, final double leerGewicht, ...
oder wie
public Flugzeug(double finalMaxGewicht, double finalLeerGewicht, ...?

und das mit this hatte ich folgendermassen am ende des Konstruktors schon versucht (aber nur lokal auf meinem PC getestet, wo es dieses temp-problem gibt - evtl. hätte es sonst funktioniert?):
this.maxGewicht = maxGewicht;
this.leerGewicht = leerGewicht;....

so meintest du das doch müder joe... oder?
 
Zuletzt bearbeitet:
>so meintest du das doch müder joe... oder?

genau
Java:
package temp;

public class Foo {
	private int foo;
	private String bar;

	public Foo(int foo, String bar) {
		this.foo = foo;
		this.bar = bar;
	}

	@Override
	public String toString() {
		return this.foo + " " + this.bar;
	}

	public static void main(String[] args) {
		System.out.println(new Foo(12, "hello"));
	}
}
 
An etwas habe ich mich schon vor einigen Jahrzehnten gewöhnt: Was üblich ist muss nicht das Beste sein.

Üblicherweise wird auch Windows eingesetzt - es gibt besseres 😀

(Die Codierrichtlinien im aktuellen Projekt sind auf jeden Fall nciht von mir erfunden worden)
Es gibt die Java Codeconventions die du vielleicht einfach nicht kennst 😉
 
Ihr macht es wohl so, aber ich finde das schlecht leserlich.
Und wozu es führen kann haben wir ja gesehen - also lieber andere Namenwählen

this.value = StringValue.from(value);
Was ist "value"? eine lokale Variable? ein Parameter? -> wenn hier pValue steht ist es doch klarer.

this.count = size; -> unterschiedliche Namen - ok, aber betreffend "size" -> gleiche Fragen wie oben

Das ergibt sich doch aus dir direkten Umgebung?
 
OT? Egal! 🙂
Die Conventions muss ich nicht kennen - Richtlinien stehen über Konventionen. 😀

Ein Kurzbericht aus der realen, nicht akademischen Welt der industriellen Softwareentwicklung. (Logischerweise sind wir der Überzeugung, dass wir alles viel besser wissen als der Rest der Welt :lol: ähm - im Ernst - vieles gefällt mir wirklich besser als es die Conventions offensichtlich vorsehen)

(Ach ja, aktuell arbeite ich bei einem Zulieferer für die Bauindustrie)

Bis jetzt sagten alle Richtlinien denen ich begegnet bin aus, dass Namen eindeutig sein müssen und dass Gross und Kleinschreibung nicht als Unterschied gilt.

Aktuell gilt pXxx für Parameter, mXxx für Membervariablen, cXxx für Initialisierungskonstanten, lXxx für lokal Variablen

getter und setter müssten eigentlich getXxx und setXxx heissen, aber bei den gettern fehlt das get meistens
 
Das ergibt sich doch aus dir direkten Umgebung?

Es ist aber nicht einfach zu erkennen - für den Menschen nicht - Logisch dass es der Compiler schafft ;-)


Noch was anhängen:

Ich wechsle die Programmiersprachen relativ oft und gewöhne mir sicher nicht jedesmal einen neuen Stil an.
Ausserdem ist es ein sehr gutes Gefühl, wann man nah einiger Zeit bei einem alten Auftraggeber Code warten muss und sich gleich zurecht findet 😉
 
Zuletzt bearbeitet:
OT? Egal! 🙂
Die Conventions muss ich nicht kennen - Richtlinien stehen über Konventionen. 😀

Ein Kurzbericht aus der realen, nicht akademischen Welt der industriellen Softwareentwicklung. (Logischerweise sind wir der Überzeugung, dass wir alles viel besser wissen als der Rest der Welt :lol: ähm - im Ernst - vieles gefällt mir wirklich besser als es die Conventions offensichtlich vorsehen)

(Ach ja, aktuell arbeite ich bei einem Zulieferer für die Bauindustrie)

Bis jetzt sagten alle Richtlinien denen ich begegnet bin aus, dass Namen eindeutig sein müssen und dass Gross und Kleinschreibung nicht als Unterschied gilt.

Aktuell gilt pXxx für Parameter, mXxx für Membervariablen, cXxx für Initialisierungskonstanten, lXxx für lokal Variablen

getter und setter müssten eigentlich getXxx und setXxx heissen, aber bei den gettern fehlt das get meistens
Ist das derselbe Arbeitgeber über den du sonst so jamerst weil da nx nach plan läuft sondern alles vom unwissenden Projektleiter vorgegeben wird? 😉

Nix für ungut, aber die Java Codeconventions werden im allgemeinen von Javaentwicklern eingehalten, mit begründeten Ausnahmen.
Eure Codeconventions sind eher aus C/C++ entlehnt.
Ich denke nicht das du die Praktiken hier als "normal" oder "gut" darstellen solltest 😉
 
Pascal, Modula, Ada, Chill, Portal, Assembler - ein wenig C++ und gaaanz wenig C

ich bin bekennender Ada-Fan - wegen dem sturen Typenverständnis dieser Sprache - darum mag ich auch Java ziemlich gut ;-) --- wir freunden uns so nach und nach an :toll:
 
vielen dank euch!!! hat nun geklappt!
meine letzten beiden fragen für heute wären:

hallo maki,

bitte nochmal kurz zu deinem final-vorschlag - ich versteh das so:
public Flugzeug(final double maxGewicht, final double leerGewicht, ...
und danach attrib-zuweisung über this vornehmen...
richtig?

frage bzgl. this-verwendung:
ob ich
-->
public Flugzeug(double maxGewicht)
{
this.maxGewicht = maxGewicht;
}

oder
-->
public Flugzeug(double mg)
{
this.maxGewicht = mg;
}
verwende, ist also egal? oder gilt eines von beiden nun als schlechter stil???

danke und gruß!
 
bitte nochmal kurz zu deinem final-vorschlag - ich versteh das so:
public Flugzeug(final double maxGewicht, final double leerGewicht, ...
und danach attrib-zuweisung über this vornehmen...
richtig?
Ja, richtig.

verwende, ist also egal? oder gilt eines von beiden nun als schlechter stil???
Mit dem final vor dem Parameter kann dir der Compiler sagen ob du es falsch machst, einfach mal ausprobieren 😉
Kurz: final vor Parameter, this vor referenzvariablen bei Zuweisungen im Konstruktor/Setter.
 
Java:
public Flugzeug(final double maxGewicht)
    { 
        this.maxGewicht = maxGewicht;
    }

    public Flugzeug(final double mg)
    { 
        this.maxGewicht = mg;
    }

Beide Konstruktoren bewirken genau dasselbe. Stil - wie du ja bemerkst scheiden sich da die Geister ein wenig, aber das ist bitte nicht als Streit zu verstehen 🙂

Wichtig ist aber schon, dass die Bezeichungen etwas aussagen - mg ist vielleicht etwas kurz (Ach ja und nach meiner Notation währe es ja mG oder mGewicht)

Aber ich glaube in einem sind wir uns einig - wenn du einen Stil hast, zieh den konsequent durch.
Wenn du den Parametern denselben Namen wie den Membern geben möchtest, mach das immer so (bis auf die Ausnahmen 🙂 )
 
Zuletzt bearbeitet:
Mich würde mal interessieren, warum deine getter Parameter haben 😉
Damit kannst du eben Fehler vermeiden:
Java:
class Test {
  private int value;
  public void setValue1(int value) {
    value = value; //kann ja mal passieren
  }
  public void setValue2(final int value) {
    value = value; //wird dir ein Fehler schmeißen, weil es
    this.value = value; //heißen soll
  }
}
}

Generell sehen es manche Codestyler nicht gern, wenn man Parameter verändert.
 

Zurück
Oben