# einfaches Programm -> Fehler beim Kompilieren



## RobertMuc (28. Juni 2004)

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


----------



## Thomas Darimont (28. Juni 2004)

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


----------



## RobertMuc (28. Juni 2004)

Vielen Dank für Deine  Hilfe ! Jetzt hat es funktioniert. 

Gruß,
Robert


----------



## RobertMuc (28. Juni 2004)

*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


----------



## Thomas Darimont (28. Juni 2004)

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


----------



## RobertMuc (28. Juni 2004)

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 ?


----------



## Thomas Darimont (28. Juni 2004)

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


----------



## squeaker (28. Juni 2004)

"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.


----------



## RobertMuc (28. Juni 2004)

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


----------

