Java NullPointerException bei DirCopy

Dr_Cox1911

Cadet 4th Year
Registriert
Sep. 2011
Beiträge
114
Hab da grad ein etwas komisches Problem und komm einfach nicht auf den Fehler.
Möchte in Java einen Ordner samt Inhalt an eine andere Stelle kopieren und anschließend den Quellordner löschen.

Hier ist der Code für das Kopieren:
Code:
public class CopyDirectory { 
     
    private BufferedInputStream in = null; 
    private BufferedOutputStream out = null; 
     
    public void copyDir(File quelle, File ziel) throws FileNotFoundException, IOException { 
    	System.out.println(quelle.list());
    	
        File[] files = quelle.listFiles();
        
        ziel.mkdirs(); 
        for (File file : files) { 
            if (file.isDirectory()) { 
                copyDir(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName())); 
            } 
            else {
                copyFile(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName()));   
            }
        }
        
    } 
     
    public void copyFile(File file, File ziel) throws FileNotFoundException, IOException { 
         
        System.out.println("Copy " + file.getAbsolutePath() + " to " + ziel.getAbsolutePath()); 
        in = new BufferedInputStream(new FileInputStream(file)); 
        out = new BufferedOutputStream(new FileOutputStream(ziel, true)); 
        int bytes = 0; 
        while ((bytes = in.read()) != -1) { 
            out.write(bytes); 
        } 
        in.close(); 
        out.close(); 
    }
    public boolean del(File dir){
        if (dir.isDirectory()){
                String[] entries = dir.list();
                for (int x=0;x<entries.length;x++){
                    File aktFile = new File(dir.getPath(),entries[x]);
                    del(aktFile);
                }
                if (dir.delete())
                    return true;
                else
                    return false;
            }
            else{
                if (dir.delete())
                    return true;
                else
                    return false;
            }
    }
und hier der Aufruf (mit Beispielpfaden, natürlich wurde vorher eine Instanz von CopyDirectory gebildet):
Code:
File quelle = new File("F:\test");
File ziel = new File("E:\test");

try {
    copydir.copyDir(quelle, ziel);
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}
Warum wirft er mir hier eine NullPointerException?
So wie es aussieht, schafft hängt er sich hier auf:
Code:
System.out.println(quelle.list());
    	
        File[] files = quelle.listFiles();
 
Zuletzt bearbeitet:
Hast du mal getestet ob er deine beiden FILE objekte (quelle/ziel) auch wirklich anlegt?
 
Anlegen sollte er die File-Objekte schon (kann ja mit isDirectory überprüfen ob es ein Ordner ist). Es liegt zum Testen nur eine Datei im Quellordner.

Das komische dabei: Wenn ich versuche mit meiner Methode "CopyFile" eine Datei zu Kopieren, so funktioniert es ebenfalls nicht.
 
Stichwort Escapesequenzen.

"F:\\" statt "F:\".

Ach und noch eine Kleinigkeit:
Code:
            if (dir.delete())
                return true;
            else
                return false;
geht wesentlich kürzer mit
Code:
return dir.delete();
 
Hab natürlich mit Escape gearbeitet (sorry, hab das Szenario hier für Testzwecke vereinfacht dargestellt, funktioniert mit Escapen und dem einfachen Szenario auch nicht).

Wenn ich vor der Übergabe (also beim Aufruf) auf die File-Objekte zugreife funktioniert es, wenn ich dagegen innerhalb der Methoden auf die Objekte zugreife klappt es nicht.
 
Dann muss bei dir noch was anderes anliegen, was hier nicht gepostet ist oder mit deinem System zusammenhängt. Ich habe deinen Code hier rauskopiert und in Eclipse geklatscht, imports organized, die Pfade beim Aufruf angepasst (kopiere bei mir den Ordner C:\test1 nach C:\test2) und es hat problemlos kopiert.

Startest du das denn in Windows (wegen den backslashes)?

Sicherheitshalber nochmal hier reinkopiert:
Code:
package playground;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyDirectory
{
    private BufferedInputStream        in    = null;
    private BufferedOutputStream    out    = null;

    public void copyDir(File quelle, File ziel) throws FileNotFoundException, IOException
    {
        System.out.println(quelle.list());
        File[] files = quelle.listFiles();
        ziel.mkdirs();
        for (File file : files)
        {
            if (file.isDirectory())
            {
                copyDir(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName()));
            }
            else
            {
                copyFile(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName()));
            }
        }
    }

    public void copyFile(File file, File ziel) throws FileNotFoundException, IOException
    {
        System.out.println("Copy " + file.getAbsolutePath() + " to " + ziel.getAbsolutePath());
        in = new BufferedInputStream(new FileInputStream(file));
        out = new BufferedOutputStream(new FileOutputStream(ziel, true));
        int bytes = 0;
        while ((bytes = in.read()) != -1)
        {
            out.write(bytes);
        }
        in.close();
        out.close();
    }

    public boolean del(File dir)
    {
        if (dir.isDirectory())
        {
            String[] entries = dir.list();
            for (int x = 0; x < entries.length; x++)
            {
                File aktFile = new File(dir.getPath(), entries[x]);
                del(aktFile);
            }
            if (dir.delete())
                return true;
            else
                return false;
        }
        else
        {
            if (dir.delete())
                return true;
            else
                return false;
        }
    }

    public static void main(String[] args)
    {
        File quelle = new File("C:\\test1");
        File ziel = new File("C:\\test2");

        CopyDirectory copydir = new CopyDirectory();

        try
        {
            copydir.copyDir(quelle, ziel);
        }
        catch (FileNotFoundException e1)
        {
            e1.printStackTrace();
        }
        catch (IOException e1)
        {
            e1.printStackTrace();
        }
    }
}
 
Zuletzt bearbeitet:
Deine Quelle ist falsch.

Code:
File quelle = new File("F:\\test");
wäre richtig.
Das müsste er eigentlich sogar als Fehler melden.

Ach, da war wer schneller. <.<
 
Jop, starte das ganze in Windows. Kann es mir auch nicht erklären, was da bei der Parameterübergabe schief läuft. Vorher sind die File-Objekte da, innerhalb der Methoden nicht.
 
Und es wird noch kurioser. Wenn ich die Methoden von der Klasse CopyDirectory direkt in die "normal" Klasse kopiere und damit arbeite, klappt alles.

Also liegt es wirklich an der Übergabe der File-Objekte.
Kann mir denn wer erklären, was da nicht passt?
 
deshalb fragt man auch immer ab ob ein array leer ist
Code:
!= null

schau mal hier sehr übersichtlich vllt hilfts dir bei deinem problem

LINK

lass mal debugger drüberlaufen dann siehste ja wo es hackt

was meinst du denn mit deienr normalen klasse ?
 
Mit "normalen Klasse" meine ich die Klasse, die diesen Aufruf enthält:
Code:
File quelle = new File("F:\test");
File ziel = new File("E:\test");
 
quelle.listFiles(); //hier funktioniert der Aufruf, das File-Objekt existiert und ist gültig

try {
    copydir.copyDir(quelle, ziel); //dieser Aufruf funktioniert nicht, der "quelle.listFiles()"-Aufruf in dieser Methode (siehe erster Post) funktioniert nicht, da das übergebene File-Objekt hier nicht gültig zu sein scheint
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

Das komische ist ja, dass das File-Objekt funktioniert bevor der Aufruf erfolgt (siehe Quelltext für nähere Beschreibung).
 
Dr_Cox1911 schrieb:
Das komische ist ja, dass das File-Objekt funktioniert bevor der Aufruf erfolgt (siehe Quelltext für nähere Beschreibung).

Es funktioniert danach und das 100%. : )
Lass dir mal in der Methode die FileObjekte ausgeben, .. es kann nur null rauskommen, wenn der Path nicht gültig ist.



Code:
package main;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyDirectory {

	public void copyDir(File quelle, File ziel) throws FileNotFoundException,
			IOException {
		
		
		System.out.println("Quelle: " + quelle);
		System.out.println("Ziel: " + ziel);
		
		
		System.out.println(quelle.list());

		[...] // verkürzt dargestellt.
		}
}
 
Zuletzt bearbeitet: (Rest war unnötig.)
Also du sagtest zwar, dass du weißt, dass du den slash escapen musst, aber nun postest du ihn 1) schon wieder falsch und 2) führt dieser Fehler genau zu dem Verhalten, welches du beschreibst:
Es funktioniert scheinbar, weil \t zufällig eine Escapesequenz ist (tab) was dazu führt, dass der Pfad "F: test" heißt. Damit findet sich das Programm auch erstmal ab und erstellt das passende File-Objekt. Sobald du aber listFiles() aufrufst, fällt unangenehm auf, dass an diesem sinnlosen Pfad nichts zu finden ist, und da returned es auch null (wie auch in deinem ersten Beispielaufruf vor der Übergabe). null zu returnen ist ja nichts verwerfliches, daher auch keine Fehlerausgabe.

Wenn die Methode nun aber auf dieses null zugreift (im for-each loop), dann knallts.

Edit:
Also um das nochmal zusammenzufassen: deine quelle ist nicht null, weder vor dem Methodenaufruf noch darin. null ist nur was listFiles() liefert und das liegt definitiv an einer fehlerhaften Pfadangabe beim Aufruf.
 
Zuletzt bearbeitet:
Tumbleweed ist ein Held!

Code:
		File quelle = new File("C:\test");
		File ziel = new File("C:\test2");
Ergibt:
Code:
Quelle: C:		est
Ziel: C:	est2
null
Exception in thread "main" java.lang.NullPointerException
	at main.CopyDirectory.copyDir(CopyDirectory.java:28)
	at main.Main.main(Main.java:17)
In der Ausgabe! Hättest einfach mal deine Objekte ausgegeben ; P
 
Zurück
Oben