verständnisproblem bei File

Status
Nicht offen für weitere Antworten.

steff3

Bekanntes Mitglied
Code:
 JFileChooser fc = new JFileChooser();
 File file = null;

      file = fc.getCurrentDirectory();		    	  
      file = fc.getSelectedFile();

  ...
  file.getAbsolutePath();
  file.getName();

wieso kann ich das mit null initialisieren? - ohne new, wenn es doch ein objekt ist

und woher weis das objekt beim zuweisen was der pfad ist und was der file name ist?
es handelt sich doch nur um den = operator und nicht file.set...
 
steff3 hat gesagt.:
Code:
 JFileChooser fc = new JFileChooser();
 File file = null;

      file = fc.getCurrentDirectory();		    	  
      file = fc.getSelectedFile();

  ...
  file.getAbsolutePath();
  file.getName();

wieso kann ich das mit null initialisieren? - ohne new, wenn es doch ein objekt ist

und woher weis das objekt beim zuweisen was der pfad ist und was der file name ist?
es handelt sich doch nur um den = operator und nicht file.set...

Das Beispiel ist in der Tat unsinnig, wo hast du das her?
 
Das Beispiel macht nur Sinn, wenn man den Scope von File vergrösern will z.b. bei einem Try-Catch-Block oder einer If-Abfrage.
 
Hi,
du kannst jedes Objekt mit null initialisieren.
Deine Variablen sind eigentlich nur Objektreferenzen (implizite Zeiger auf ein Objekt). Null ist dabei einfach ein reservierter Zeiger. Er zeigt dabei auf eine Adresse, die nicht beschrieben werden kann. Anders gesagt, null zeigt eigentlich nur an, dass du auf keine Instanz zeigst.
Mit Hilfe von Null kannst du also anzeigen, dass du im Moment noch nichts zugewiesen hast. Greifst du auf eine Variable zu, die den Wert null enthält, würde eine Null-Pointer Exception ausgelöst werden, du weißt also, dass hier keine Instanz angelegt wurde. Weißt du umgekehrt einer Variablen, die nicht auf null zeigt diesen Wert zu, würde die Referenz auf das ursprüngliche Objekt herabgesetzt werden (Java merkt sich wie viele Variablen ein Objekt referenzieren). Gibt es keine gültige Referenz mehr auf dieses Objekt (speichert keine Variable mehr diese konkrete Instanz), wird die Garbage Collection diese Variable auch frei geben.
Null ist also durchaus wichtig und sinnvoll (wenn auch nicht unbedingt in diesem Beispiel. An sich sollte man beim Arbeiten mit Ressourcen einen Ressourcen-Schutzblock anlegen
 
den code habe ich mir selber zusammen gebastelt...
Code:
JFileChooser fc = new JFileChooser();
		 File file = null;
		 
		
	
		
		 fc.setFileFilter( new FileFilter()
				    {
				    public boolean accept( File f )
				      {
				        return f.isDirectory() ||
				          f.getName().toLowerCase().endsWith( ".pdf" );
				      }
				      public String getDescription()
				      {
				        return "PDF";
				      }
				    } );
		    int state = fc.showSaveDialog(null);
		    if ( state == JFileChooser.APPROVE_OPTION )
		    {
		    	  file = fc.getCurrentDirectory();	//okay	    	  
		    	  file = fc.getSelectedFile(); // aha nochmal der = operator und trotzdem sind beide strings enthalten
		    }
das mit null war mir ja soweit klar, aber ich dachte bevor ich mit dem objekt arbeite, muss ich es immer mit new initialisieren

aber viel wichtiger ist für mich immer noch die frage mit dem zuweisen des namens und des pfades
 
steff3 hat gesagt.:
das mit null war mir ja soweit klar, aber ich dachte bevor ich mit dem objekt arbeite, muss ich es immer mit new initialisieren

Stimmt so nicht ganz. Du kannst dir natürlich auch von jmd. anderen das Erzeugte Objekt holen. Einfache Beispiele wären hier das Fabrik- bzw. das Singleton-Pattern.
Code:
class A {
 ...
}

class A_Fabrik {
  public static A getNewA() {
    // erzeugen und initialisieren
    A result = new A(); //  <-- hier der new A() Aufruf
    ...
    return A; 
  }
}

Ja, jetzt kannst du ganz einfach eine A Instanz erzeugen ohne selbst new Aufzurufen.
Code:
A a = A_Fabrik.getNewA();


Natürlich kannst du auch einfach eine Instanz in einer Variablen speichern und diese dann zurückgeben. Das passiert einfach nur in dem Beispiel, dass du da oben gezeigt hattest.

steff3 hat gesagt.:
Code:
  File file = null; // jetzt gibt es keine Instanz von File, anders gesagt file ist leer, nicht da..
  ...		 
  file = fc.getCurrentDirectory();  // hier holst du dir die eine Instanz von fc (egal wo fc die herholt)
                                                // file zeigt jetzt auf genau diese Instanz

  file = fc.getSelectedFile();         // hier überschreibst du die alte Instanz. Überschreiben ist falsch gesagt
                                                // file zeigt nun auf die per getSelectedFile() Instanz. Wo die herkommt ist egal, 
                                                // du löscht den alten Wert von file und kopierst diesen neu rein. Die vorige Zeile
                                                // könntest du also auch weglassen, es wäre das gleiche Ergebnis!

Ich denke du machst hier den Fehler anzunehmen, dass ein File auch eine Datei ist. In Java ist ein File abstrakter. Du hast ein paar Eigenschaften unter anderem einen Pfad. Ob dieser ein Verzeichnis oder eine Datei meint, steht nicht fest (kannst du aber per file.isDirectory() abfragen).

Gruß Der Unwissende
 
das problem war viel einfacher
Code:
file = fc.getCurrentDirectory();		
file = fc.getSelectedFile();

ich dachte das die erste funktion den pfad ermittelt und die 2te den namen des files

und deshalb vermutete ich beide sind nötig für
file.getAbsolutePath()

und habe mich halt gewundert wie man file 2 sachen zu weisen kann und das objekt weis welche variablen es belegen soll

aber fc.getSelectedFile(); gibt gleichzeitig den pfad mit an..... womit dann alles geklärt wäre
😀
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben