# Den Code verstehen



## sengul (27. Jun 2017)

Hallo,
ich bin mir nicht sicher ob ich folgendes Code richtg verstanden habe, waere sehr dankbar für jede Hilfe. 

```
package myUtils.system;
import java.io.*;

class UtilitiesSystem{
     public static void main (String args[]){
          foo();
     }
     public static void foo (){
          File pwd=new File(System.getProperty("user.dir"));
          if (pwd.isDirectory()){
               File [] bar=pwd.listFiles();
               for (int i=0;i<bar.length;i++){
                   System.out.println (bar[i].getName());
               }
          }else{
              System.out.println ("Error. The argument is not a directory");
          }
     }
}
```

In der Methode foo() wird erst das Objekt File mit dem Pfadnamen "user.dir" erstellt.
Mit der Methode isDirectory() vom Klasse File wird getestet, ob das erzeugte Datei ein Verzeichnis ist, (hier kommt der Wert true raus nach erfolgreiches compielen)
Danach wird vom Typ File ein Array namens *bar *erstellt, der alle Pfade der dateien und Verzeichnisse unter dem Verzeichnis "pwd" als File Objekte zurückgibt. In der for Schleife wird dann das Array bar für jeden index durchgegangen, und die Namen der Dateien und Verzeichnisse gedruckt. In die else springt es nur wenn das File Object "pwd" kein Verzeichnis ist.
Habe ich den Code richtig verstanden, oder was ist mein Fehler?

Ich muss noch das richtige von oben ankreuzen, stimmt meine Wahl? Ich hoffe ich habe dies richtig angekreuzt, Im folgenden möchte ich erklaeren, weshalb ich so gewaehlt habe.

1 und 2 stimmen nicht weil das Programm ohne Probleme compiliert und die Klassen File und System werden auch importiert.
3 und 4 ist richtig, weil ich die Methode foo() in einer anderen Klasse die unter einem anderen Package liegen gerufen habe und das selbe output bekommen habe. Dabei habe ich das Package “myUtils.system” importiert, auch mit dem import “myUtils” hat es funktioniert.
Bei 5 und 6 war ich mir nicht ganz sicher, ob eine von denen stimmt.
7 stimmt nicht, weil das Package “java.io” mehrere Klassen hat als nur die Klasse File.
8 stimmt nicht, weil wenn das File Object “pwd” kein Verzeichnis ist, wird das message ausgedruckt.
9 stimmt nicht, weil aus dem oben beschriebenen Grund.
Habe ich die richtigen angekreuzt?

Vielen Dank


----------



## mrBrown (28. Jun 2017)

sengul hat gesagt.:


> 1 und 2 stimmen nicht weil das Programm ohne Probleme compiliert und die Klassen File und System werden auch importiert.


Richtig.


sengul hat gesagt.:


> 3 und 4 ist richtig, weil ich die Methode foo() in einer anderen Klasse die unter einem anderen Package liegen gerufen habe und das selbe output bekommen habe. Dabei habe ich das Package “myUtils.system” importiert, auch mit dem import “myUtils” hat es funktioniert.


Falsch - die Klasse ist nur im gleichem Package sichtbar.



sengul hat gesagt.:


> Bei 5 und 6 war ich mir nicht ganz sicher, ob eine von denen stimmt.


Zu 6:


sengul hat gesagt.:


> [...] alle Pfade der dateien und Verzeichnisse unter dem Verzeichnis "pwd" [...] und die Namen der Dateien und Verzeichnisse gedruckt.





sengul hat gesagt.:


> 7 stimmt nicht, weil das Package “java.io” mehrere Klassen hat als nur die Klasse File.


Und welche von denen werden importiert?



sengul hat gesagt.:


> 8 stimmt nicht, weil wenn das File Object “pwd” kein Verzeichnis ist, wird das message ausgedruckt.


Da wären beide Antworten möglich:
- Es wird niemals ausgegeben, da user.dir immer ein existierendes Verzeichnis ist, zumindest beim Programmstart
- user.dir kann seit Programmstart gelöscht sein, und ist damit kein Verzeichnis mehr



sengul hat gesagt.:


> 9 stimmt nicht, weil aus dem oben beschriebenen Grund.


Zwar richtig, aber obiges ist nicht die Erklärung


----------



## sengul (28. Jun 2017)

Hallo mrBrown, 
danke erstmal für deine Hilfe, bei 3 und 4 verstehe ich dann folgendes nicht. Wenn ich in einer Klasse die Methode foo() von einer anderen Klasse aus rufe, dabei haben diese beiden Klassen keine Beziehung zueinander, sie liegen nur in dem selben Package, dann wird die Methode foo() ausgeführt. Deshalb denke ich dass 3 und 4 richtig sind oder?

Die externe Klasse Test


```
package myUtils.system;
import myUtils.*;

public class Test {
      public static void main (String args[]){
          UtilitiesSystem.foo();
     }

}
```


----------



## mrBrown (28. Jun 2017)

Wie du schon sagst: sie liegen im selben Package - und auch nur dann funktioniert es.
Klassen die in einem anderem Package liegen, können auf die Klasse UtilitiesSystem nicht zugreifen


----------



## sengul (28. Jun 2017)

okey, ich denke das es jetzt richtig ist


----------



## mrBrown (28. Jun 2017)

Den neunten Punkt hattest du vorher richtig


----------



## sengul (28. Jun 2017)

Die Lösung ware ist wie unten, wobei ich immer noch nicht verstanden habe bei der 3. Antwort, warum eine Klasse die nicht public ist, von irgendwo zugreifbar sein  soll?


----------



## mrBrown (28. Jun 2017)

Ist sie auch nicht - die Antwort 3 ist falsch.

Und Antwort 8 ist auch nicht vollkommen richtig, mit etwas Timing bekommt man das durchaus ne Ausgabe


----------

