# Fehler im Java Code



## derRote (21. Apr 2012)

Hallöchen,

hätte mal wieder ein kurzes Anliegen.

In dieser Klasse zeigt es mir einen Fehler an bei der if-Methode (hier steht die Methode, damit Java die Datenbank mit den Rezepten durch nummerieren )

Dieser Fehler steht beim Code:
oldId.setId(i);
und
oldId.setId(i+1);

--> Cannot invoke setId(int) on the primitive type int


```
package MEINKOCHBUCH;

import java.sql.*;

public class Speise {

	/**
	 * @uml.property  name="name"
	 */
	private String name;

	/**
	 * Getter of the property <tt>name</tt>
	 * @return  Returns the name.
	 * @uml.property  name="name"
	 */
	public String getName() {
		return name;
	}

	/**
	 * Setter of the property <tt>name</tt>
	 * @param name  The name to set.
	 * @uml.property  name="name"
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @uml.property  name="zutaten"
	 */
	private String zutaten;

	/**
	 * Getter of the property <tt>zutaten</tt>
	 * @return  Returns the zutaten.
	 * @uml.property  name="zutaten"
	 */
	public String getZutaten() {
		return zutaten;
	}

	/**
	 * Setter of the property <tt>zutaten</tt>
	 * @param zutaten  The zutaten to set.
	 * @uml.property  name="zutaten"
	 */
	public void setZutaten(String zutaten) {
		this.zutaten = zutaten;
	}

	/**
	 * @uml.property  name="preis"
	 */
	private double preis;

	/**
	 * Getter of the property <tt>preis</tt>
	 * @return  Returns the preis.
	 * @uml.property  name="preis"
	 */
	public double getPreis() {
		return preis;
	}

	/**
	 * Setter of the property <tt>preis</tt>
	 * @param preis  The preis to set.
	 * @uml.property  name="preis"
	 */
	public void setPreis(double preis) {
		this.preis = preis;
	}

	/**
	 * @uml.property  name="schwierigkeitsgrad"
	 */
	private int schwierigkeitsgrad;

	/**
	 * Getter of the property <tt>schwierigkeitsgrad</tt>
	 * @return  Returns the schwierigkeitsgrad.
	 * @uml.property  name="schwierigkeitsgrad"
	 */
	public int getSchwierigkeitsgrad() {
		return schwierigkeitsgrad;
	}

	/**
	 * Setter of the property <tt>schwierigkeitsgrad</tt>
	 * @param schwierigkeitsgrad  The schwierigkeitsgrad to set.
	 * @uml.property  name="schwierigkeitsgrad"
	 */
	public void setSchwierigkeitsgrad(int schwierigkeitsgrad) {
		this.schwierigkeitsgrad = schwierigkeitsgrad;
	}

	/**
	 * @uml.property  name="gang"
	 */
	private String gang;

	/**
	 * Getter of the property <tt>gang</tt>
	 * @return  Returns the gang.
	 * @uml.property  name="gang"
	 */
	public String getGang() {
		return gang;
	}

	/**
	 * Setter of the property <tt>gang</tt>
	 * @param gang  The gang to set.
	 * @uml.property  name="gang"
	 */
	public void setGang(String gang) {
		this.gang = gang;
	}

	/**
	 * @uml.property  name="rezept"
	 */
	private String rezept;

	/**
	 * Getter of the property <tt>rezept</tt>
	 * @return  Returns the rezept.
	 * @uml.property  name="rezept"
	 */
	public String getRezept() {
		return rezept;
	}

	/**
	 * Setter of the property <tt>rezept</tt>
	 * @param rezept  The rezept to set.
	 * @uml.property  name="rezept"
	 */
	public void setRezept(String rezept) {
		this.rezept = rezept;
	}

	//Objekt für die Aufnahme von Abfrageergebnissen
	ResultSet objErgebnis = null;
	
	public void erfassen()
	{
		String mSQL; //Zugriffsobjekt wird erzeugt
		DBZugriff objZugriff = new DBZugriff();  //SQL_Befehl zum Einfügen der Artikeldaten wird in einer Variablen abgelegt
		mSQL= "INSERT INTO Rezeptverwaltung Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverewaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";
				
		objZugriff.oeffnen();
		objZugriff.aendern(mSQL);
		objZugriff.schliessen();
	}
	
//prz zum Ändern von Daten
	
	public void korrigieren()
	{
	//Variable für die SQL-Anweisung
	String mSQL;
	//Zugriffsobjekt wird erzeugt
	DBZugriff objZugriff = new DBZugriff();
	//SQL-Befehl zum Abändern der Artikekdaten wird in einer Variablen abgelegt
	mSQL = "UPDATE Rezeptverwaltung SET Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverwaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";
	
	objZugriff.oeffnen();
	objZugriff.aendern(mSQL);
	objZugriff.schliessen();
		
	}	
	
//prz um Artikel zu löschen
	
	public void loeschen()
	{
	//Variable für die SQL-Anweisung
	String mSQL;
		//Zugriffsobjekt wird erzeugt
		DBZugriff objZugriff = new DBZugriff();
		//SQL-Befehl zum Löschen der Artikeldaten wird in einer Variablen abgelegt
		mSQL= "DELETE FROM Rezeptverwaltung Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverwaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";
		
		objZugriff.oeffnen();
		objZugriff.aendern(mSQL);
		objZugriff.schliessen();
	}
	
	
		

	//hier steht die Methode, damit Java die Datenbank mit den Rezepten durch nummerieren kann
	
	int newId, oldId;
	boolean match;
	public void setOldId(int i)
	{
		this.oldId=oldId;
	}
	public int getNewId()
	{
		int i=0;
		
		if (oldId==i)
		{
			match = true;
		}
		
		else 
		{
			match = false;
		}
		
		if(match==true)
		{
			oldId.setId(i);
		}
		
		if (match==false)
		{
			oldId.setId(i+1);
			i++;
		}
		
		else
		{
			newId=i;
		}
		
		{
			return newId;
		}
	}
	
	
	
	//prz um Artikel zu suchen
	
	public void suchenSpez()
	{
		try
		{
		//Variable für die SQL-Anweisung
		String mSQL;
		//Zugriffsobjekt wird erzeugt
		DBZugriff objZugriff = new DBZugriff();
		//SQL-Befehl zum Löschen der Artikeldaten wird in einer Variablen abgelegt
		mSQL = "SELECT * FROM Rezeptverwaltung Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverwaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";
		
		objZugriff.oeffnen();
		//Methode zur Ausführung der SQL-Abfrage wird aufgerufen und das Ergebnis der Abfrage in einem Objekt der Klasse ResultSet hinterlegt
		objErgebnis = objZugriff.lesen(mSQL);
		}
		catch (Exception e)
		{
			System.out.println("Suche fehlgeschlagen!");
		}
	}
	
	public void suchen()
	{
		try
		{
		//Variable für die SQL-Anweisung
		String mSQL;
		//Zugriffsobjekt wird erzeugt
		DBZugriff objZugriff = new DBZugriff();
		//SQL-Befehl zum Löschen der Artikeldaten wird in einer Variablen abgelegt
		mSQL = "SELECT * FROM Rezeptverwaltung Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverwaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";
		
		objZugriff.oeffnen();
		//Methode zur Ausführung der SQL-Abfrage wird aufgerufen und das Ergebnis der Abfrage in einem Objekt der Klasse ResultSet hinterlegt
		objErgebnis = objZugriff.lesen(mSQL);
		}
		catch (Exception e)
		{
			System.out.println("Suche fehlgeschlagen!");
		}
	}
	
//prz um Datensatz einrem Ergebnisobjekt zuzuweisen
	
	public void zuweisen()
	{
		try
		{
		//Zeiger wird auf den nächsten Datensatz im Ergebnisobjekt gerichtet
		objErgebnis.next();
		//einem Objekt der Fachklasse Artikel werden die entsprechenden Attributswerte des Datensatzes aus der Datenbankabfrage zugewiesen
		this.name=objErgebnis.getString("name");
		this.zutaten=objErgebnis.getString("zutaten");
		this.preis=objErgebnis.getDouble("preis");
		this.schwierigkeitsgrad=objErgebnis.getInt("schwierigkeitsgrad");
		this.gang=objErgebnis.getString("gang");
		this.rezept=objErgebnis.getString("rezept");
		}
		catch (Exception e)
		{
			System.out.println("Zuweisung Ergebnisobjekt fehlgeschlagen!");
		}
	}

	/**
	 * @uml.property  name="id"
	 */
	private String id;

	/**
	 * Getter of the property <tt>id</tt>
	 * @return  Returns the id.
	 * @uml.property  name="id"
	 */
	public String getId() {
		return id;
	}

	/**
	 * Setter of the property <tt>id</tt>
	 * @param id  The id to set.
	 * @uml.property  name="id"
	 */
	public void setId(String id) {
		this.id = id;
	}
	
}
```

leider weiß ich nicht was der Fehler bedeutet bzw wie ich ihn lösen kann

über eure Hilfe wär ich sehr dankbar


----------



## Marcinek (21. Apr 2012)

https://www.google.de/search?q=cannot+invoke+setId(int)+on+the+primitive+type+int

Vergleich Integer und int


----------



## derRote (21. Apr 2012)

die gleichen Ergebnisse habe ich mir vor ein paar Minuten auch schon angeschaut

leider komm ich mit diesen Ergebnisse nicht klar.

also was soll ich an meinem Code verändern?


----------



## Marcinek (21. Apr 2012)

Du rufst eine Methode auf einem primitiven Datentyp auf. 

Das musst du abstellen, da primitive Datentypen garkeine Methoden haben.


----------



## derRote (21. Apr 2012)

das heißt????


----------



## Marcinek (21. Apr 2012)

Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)

Defining Methods (The Java™ Tutorials > Learning the Java Language > Classes and Objects)


----------



## derRote (21. Apr 2012)

das heißt ich soll meinen Datenyp ändern....

Oder wie sol der neue COde denn genau aussehen?


----------



## Volvagia (21. Apr 2012)

```
oldId = i;
oldId = i + 1;
```

?
Bevor du mit Datenbank rumspielst solltest du die grundlagigste Grundlage von Java kennen. (Meine Meinung.)

btw. "boolean == true" ist unnötig. Das Ergebnis ist wenn die bool. true ist true, sonst false.


----------



## derRote (21. Apr 2012)

Dieser Code :

```
oldId = i;
oldId = i + 1;
```

erfüllt letztendlich nicht den Sinn.....

an welche Stelle sollte diese Deklarierung überhaupt?


----------



## Marcinek (21. Apr 2012)

Das hängt doch von deinem Code ab und was er machen soll.

Ich habe mir das nicht angeschaut das musst du schon selber machen.


----------



## Volvagia (21. Apr 2012)

Was hast du denn vor?
Du wolltest doch oldInt den Wert von i geben, oder? Wobei i an der Stelle nur 0 sein kann. "this.oldId=oldId" kommt mir auch sehr fragwürdig vor, ist doch die selbe Variable.


----------



## Marcinek (21. Apr 2012)

Das hängt doch von deinem Code ab und was er machen soll.

Ich habe mir das nicht angeschaut das musst du schon selber machen.

Ist der Code überhaupt von dir?


----------



## derRote (21. Apr 2012)

na klar ist der Code von mir


----------



## Spacerat (21. Apr 2012)

Volvagia hat gesagt.:


> true ist true, sonst false.


Das ist doch nur in PHP möglich????:L
@TO: ...und das was du da machst, kennt man vllt. von C#. Da können afaik auch für primitive Member einer Klasse mehr oder weniger eingeschränkte Getter bzw. Setter definiert werden, allerdings heissen diese dann nur "get()" bzw. "set()". In Java können weder primitiv Typen noch deren Wrapper-Klassen erweitert werden. Bei einem Zahlenwert also eine ID setzen zu wollen, kann dann eigentlich nur ein Irrtum sein. Es sieht aus meiner Sicht auch bei weitem nicht so aus, als wolltest du ganz banal zu oldID etwas hinzuzählen oder abziehen, also was hast du vor?


----------



## Volvagia (21. Apr 2012)

Spacerat hat gesagt.:


> Das ist doch nur in PHP möglich????:L


Ich glaube du hast mich falsch verstanden.
Ich meinte einfach nur "if(match==true)" = "if(true==true)" = "if(true)" = "Rein in die Klammern". Oder eben "if(match==true)" = "if(false==true)" = "if(false)" = "Weitermachen, hier gibt es nichts zu sehen."


----------



## Spacerat (21. Apr 2012)

Volvagia hat gesagt.:


> Ich glaube du hast mich falsch verstanden.


[OT]Doch, hab' ich. Du aber den Witz nicht. Leider finde ich's grad' nicht, aber es gibt einen Beweis, dass in PHP "TRUE" auch mal "FALSE" sein kann. Ging irgendwie so: [c]"0" liefert true, 0 liefert false, "0" == 0 liefert true. Daraus folgt true ist gleich false.[/c] Das die dort aber nur auf inhaltlich Gleich prüfen, wird nirgendwo erwähnt. Immerhin ein hauchdünner Stolperdraht in PHP.[/OT]


----------



## derRote (21. Apr 2012)

hab ja schon in den anderen Themen von mir erwähnt, dass ich ein Projekt machen muss und deswegen habe ich mich für ein Kochbuch entschieden....

da die Datenbankanbindung noch nicht funktioniert, habe ich mich schlau gemacht was noch fehlen könnte und bin darauf gestoßen, dass ich eine Id definieren muss, die nach jedem Eintrag in die Datenbank eine Zeile weiter nach unten rutscht....das könnte dann wiederrum der Grund dafür sein, dass die Daten noch nicht in der Datenbank gespeichert werden können....

die Prozedur mit dem Fehler soll zeigen, dass falls die Zahl schon existiert die nächste Zahl angezeigt werden muss....

ich hoffe ich hab mich einigermaßen ausgedrückt, damit ihr mein Problem versteht

wär echt cool, wenn mir jemand helfen könnte:toll:


----------



## Volvagia (21. Apr 2012)

Ich denke du meinst den "auto_increment"-Wert. Dieser adressiert jeden Eintrag in einer beliebigen Spalte mit Primärschlüssel. Das ist aber eine Datenbankinterne Angelegenheit, und musst du ihr bei der Erzeugung oder später (SQL standartgemäß alter) festlegen, dass eine Spalte der Primärschlüssel ist und dieser Auto_inc ist. Außerdem glaube ich mich zu errinnern, dass zumindest unter MySQL vorher die Datenbank ausgelesen, geleert und danach die Datensätze neu eingefügt werden müssen.

Trotzdem solltest du problemlos speichern können. Speicherst du über dein Programm oder was externen?

Aber trotzdem ist mir das geschriebene noch kein bischen klar.


```
int newId, oldId;
    boolean match;
    public void setOldId(int i)
    {
        this.oldId=oldId; //Du kopierst eine Variable in sich selbst?
    }
    public int getNewId()
    {
        int i=0;
        
        if (oldId==i) //Ist old 0?
        {
            match = true;
        }
        
        else 
        {
            match = false;
        }
        
        if(match==true)
        {
            oldId.setId(i); //...dann setze old auf 0
        }
        
        if (match==false)
        {
            oldId.setId(i+1); //Sonst setze old auf 1
            i++; //Die Variable siehst du danach nie wieder
        }
        
        else
        {
            newId=i; //Wenn old auf 0 gesetzt wurde, setze new auf 0.
        }
        
        {
            return newId;
        }
    }
```


----------



## derRote (21. Apr 2012)

Im Voraus vielen Dank für Eure Hilfe.:applaus:

ich möchte die Daten über meine Java Programm Eclipse in der Access Datenbank speichern.

Die Werte hab ich dementsprechend auf null und eins gesetzt.

Den Fehler zeigt es leider immer noch an.

Primärschlüssel und auto-inc hab ich alles gesetzt.

Was könnte ich jetzt noch machen??


----------



## Volvagia (21. Apr 2012)

Wie schon gesagt wurde, primitive Datentypen (boolean, byte, short, char, int, long, float, double) haben keine Methoden.
Wenn du 2 int hast:


```
int i = 8;
int j = 5;
```

...und eine auf dem Wert einer anderen setzen willst, musst du einfach nur überschreiben:


```
int i = 8;
int j = 5;

j = i;
```

...und die eine Variable hat den Wert der anderen.


```
int i = 8;
int j = 5;

j = i;
System.out.println(j); //8
```


----------



## derRote (21. Apr 2012)

der Fehler wird leider immer noch angezeigt...

könntest du mir vielleicht meinen Code mit der richtigen Deklarierung posten ?

ich will hier wirklich nix gemacht bekommen....ich hab selbst wirklich schon alles versucht...


des wär echt richtig super....ich wär dir extrem dankbar:toll:


----------



## Volvagia (21. Apr 2012)

Lösche es. Die Datenbank nummeriert mit auto_increment automatisch durch, da musst du nichts machen. Dein Problem liegt wo anders.

Deine Query:

mSQL= "INSERT INTO Rezeptverwaltung Rezeptverwaltung.Name="+this.name+", Rezeptverwaltung.Zutaten="+this.zutaten+", Rezeptverwaltung.Preis="+this.preis+", Rezeptverwaltung.Schwierigkeitsgrad="+this.schwierigkeitsgrad+", Rezeptverwaltung.Gang="+this.gang+", Rezeptverewaltung.Rezept="+this.rezept+" WHERE (((Rezeptverwaltung.newId)="+this.oldId+"));";

Was hat ein WHERE in einen INSERT INTO verloren? Der Code muss so aussehen:

INSERT INTO Ziel [(Feld1[, Feld2[, ...]])] VALUES (Wert1[, Wert2[, ...])

Ich vermute du hast irgendwo in DBZugriff ein try ohne catch-Inhalt und verschluckst so die Fehlerausgabe des Datenbanktreibers.


----------



## Marcinek (21. Apr 2012)

Langsam für dich

du hast ein INT (primitiv) und machst nun int.setID(). Und hier bekommst du den Fehler.

Vielleicht mal ein Buch zu rate ziehen oder einen der Links lesen, die hier gepostet worden sidn?


----------

