einfaches Programm -> Fehler beim Kompilieren

RobertMuc

Grünschnabel
Hi Leute,

ich bin Neueinsteiger in Java und habe Probleme, folgendes Programm zu kompilieren. Vielleicht könnt ihr mir ja kurz sagen, woran das liegen könnte.

public class Primzahl {

public static void main (String[] args) {
System.out.println("Folgende Zahlen < 20 sind prim:");
System.out.println(2);
for (int i=1; i<20; i++) {
boolean a;
for (int j=2; j<i; j++) {
a=true;
if (i%j==0)
{
a=false;
break;
}

}
if (a==true)
{
System.out.println(i);
}

}
}
}


Folgenden Fehler erhalte ich bei der Kompilierung:

C:\Dokumente und Einstellungen\Robert\Desktop>javac Primzahl.java
Primzahl.java:17: variable a might not have been initialized
if (a==true)
^
1 error

Ich denke, er liegt an der Überprüfung (a==true). a ist nicht initialisiert. Er soll aber gerade abhängig vom Wert der Schleife a entweder true oder false zuweisen.
Vielleicht könnt Ihr mir kurz helfen.

Vielen Dank,
Robert
 
Hallo!

Der Compiler meckert, weil die lokale Variable a noch nicht initialisiert worden ist wie du schon richtig gemerkt hast. In Java werden lokale Variablen nun mal von Haus aus nicht(!) initialisiert, (Initialisiert werden alle Membervariablen).
D.h. du solltest boolean a bei der deklaration auch gleichzeitig initialisieren.
boolean a = false; //Einen anderen Wert hätte a auch nicht bekommen, wenn sie defaultmäßig initialisiert worden wäre.

Gruß Tom
 
Noch ein "einfaches" Problem

public class Primzahltest {

Integer io;
boolean a;

public Primzahltest(int i) {
Integer io=new Integer(i);
}

public boolean checkPrim() {
a=true;
for (int j=2; j<io.intValue(); j++) {
if (io.intValue()%j==0)
{
a=false;
}
}
if (a==true)
{
return true;
}
else {return false;}
}

public static void main (String[] args) {
Primzahltest p = new Primzahltest(6);
p.checkPrim();
}
}

Folgenden Fehler erhalte ich bei der Ausführung des Programms (Kompilieren funktioniert):

C:\Dokumente und Einstellungen\Robert\Desktop>java Primzahltest
Exception in thread "main" java.lang.NullPointerException
at Primzahltest.checkPrim(Primzahltest.java:12)
at Primzahltest.main(Primzahltest.java:27)

Wo könnte hier der Fehler liegen ? Vielen Dank für Eure Hilfe,

Gruß,
Robert
 
Hallo!

Du deklarierst im PrimzahlTest konstruktor eine weitere lokale Variable ...
public Primzahltest(int i) {
Integer io=new Integer(i);
}

... was du aber wahrscheinlich nicht willst.

Du wolltest sicherlich das hier machen:
public Primzahltest(int i) {
io=new Integer(i);
}

Gruß Tom
 
Vielen Dank ! Ich wollte, ich würde die Fehler auch so schnell sehen wie Du ;-)

Also gibt es einen großen Unterschied zwischen

io=new Integer(i); UND Integer io=new Integer(i);

Ich dachte bisher immer, beide Konstrukte würden dasselbe bedeuten ?
Erhalte ich nicht in beiden Fällen in io ein Objekt der Klasse Integer ?
 
Hallo!

Erhalte ich nicht in beiden Fällen in io ein Objekt der Klasse Integer ?

Doch schon. Jedoch hast du hier einen "Spezialfall":

Du hast eine Membervariable Namens io vom Typ java.lang.Integer.
Im Konstruktor definierst du eine neue(!) lokale Variable mit Namen io vom Typ Integer. Diese heißt zwar genauso wie die Membervariable jedoch hat sie mit ihr nichts mehr zu tun. Nachdem der Konstruktor verlassen wird existiert die lokale Variable io nicht mehr und die Membervariable io bleibt unitialisiert.

Gruß Tom
 
"Integer io" ist eine Variablendeklaration. Diese macht die Variable dem Compiler bekannt.

"io=new Integer(i)" ist eine Variablendefinition. Diese weist der Variablen io einen Wert zu.

"Integer io=new Integer(i)" kombiniert beides.
 
Ahh, ok, danke. So etwas in der Art hatte ich auch schon vermutet. Du kannst wirklich super erklären, vielen Dank ! Ich wünsch Dir noch einen schönen Tag.

Gruß,
Robert
 

Neue Beiträge

Zurück