Nullpointer Exception in Schleife

Hi,

ich bekomme eine Nullpointer Exception hier in diesen Code.

[SPOILER] private static BufferedInputStream in = null;
private static BufferedOutputStream out = null;

public static void copyDir(File quelle, File ziel) throws FileNotFoundException, IOException { 
     
    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())); 
        } 
    } 
} 
 [/SPOILER]

Diesen Code rufe ich wie folgt auf:

				File quelle = new File(backupFolder.getPath() + ordner.get(i) + "//minecraftbukkit//" + ordner.get(i));
				DirectoryUtil.copyDir(quelle, ziel);
				DirectoryUtil.deleteDir(quelle);```

Was mache ich falsch?

Hi,

aus deiner Beschreibung kann man nicht sehen, wo eine mögliche NPE auftaucht.

Gruß,

Martin

dummheit, sry.

@Marcinek ich habe es markiert wo die Nullpointer auftritt,das meinst du doch,oder?
@mymakismus welche Zeile im Code meinst du?

P.S Diese 2 Codestücke sind aus 2 verschiedenen Klassen

files ist offensichtlich null. beziehungsweise quelle.

*** Edit ***

[QUOTE=Blackbyte]@@mymakismus welche Zeile im Code meinst du?

P.S Diese 2 Codestücke sind aus 2 verschiedenen Klassen[/QUOTE]

nene meine eigene dummheit, habe mist geschrieben

*** Edit ***

lass doch mal quelle oder files sysouten.

Mache ich gerade braucht aber kurz da ich die Methode alleine nicht ausführen kann melde mich gleich zurück ob es quelle oder files ist
Edit:
:scheiterhaufen::idea:
Ich weis jetzt woran es liegt:
Bin soooo blöd:
File quelle = new File(backupFolder.getPath() + "//" + ordner.get(i) + "//minecraftbukkit//" + ordner.get(i));
Habe vergessen diese DUMMEN // noch hinzumachen so war der Pfad nämlich backupetc/ statt backup/etc
Danke für die Hilfe

Du solltest mal einen Blick auf NIO2 werfen, wenn du Java 7 oder besser verwenden kannst: http://docs.oracle.com/javase/tutorial/essential/io/fileio.html

Da gibt es sicher wesentlich bequemere Wege für so eine Kopie.

Okay werde ich,da ich auch Java 7 installiert habe

Was soll der doppelte Slash ("//")?

Afair braucht man diesen nicht escapen, sondern nur den Back-Slash “”. Und diesen escapet man mit einem Backslash.
“\” würde also Sinn machen um einen BackSlasch “” zu erhalten.
Aber “//”?

Soll rekursiv das komplette Ordner kopiert werden - oder nur alle Dateien? Soll auch der Inhalt kopiert werden - oder nur alle Dateien und/oder Ordner erstellt werden?

@Unregistred Der Doppelte Slash wird später durch einen Backslash ersetzt. @CyborgBeta es soll rekursiv der ganze Ordner kopiert werden inklusive Inhalt

Aber es funktioniert ja nun hatte ja geschrieben wieso weshalb warum,kann es aber noch performanter vll. machen

Ich habe dir mal “schnell” den Anfang geschrieben:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg13kopieerstellen;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

/**
 * @author CB
 */
public class Main {

    public static File[] fromTo() {
        JFileChooser jfc = new JFileChooser();
        jfc.setMultiSelectionEnabled(false);
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jfc.setFileFilter(new FileFilter() {
            @Override
            public boolean accept(File f) {
                return true;
            }
            @Override
            public String getDescription() {
                return "JFileChooser.DIRECTORIES_ONLY";
            }
        });
        File from, to;
        if (jfc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION || !(from = jfc.getSelectedFile()).isDirectory() || !from.canWrite() || jfc.showSaveDialog(null) != JFileChooser.APPROVE_OPTION || !(to = jfc.getSelectedFile()).isDirectory() || !to.canWrite()) {
            return null;
        }
        return new File[]{from, to};
    }

    public static void copy(File from, File to) throws IOException {
        throw new UnsupportedOperationException("Not supported yet.");
        
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println(Arrays.toString(fromTo()));
        
    }
}```

jfc erlaubt nur Verzeichnisse,
ist jfc APPROVE_OPTION gewählt, wurde ein Verzeichnis gewählt (getSelectedFile != null),
ist isDirectory ,besteht dieses Verzeichnis,
ist canWrite ,besteht dieses Verzeichnis und kann beschrieben werden.

In copy:
Erstelle Verzeichnis from in to,
lege dir ArrayDeque<File> an,
lege from in adf,
solange adf nicht leer:
Nimm erstes File aus adf,
ist es ein Verzeichnis:
Erstelle Verzeichnis in to,
füge Files aus Verzeichnis adf hinten hinzu,
ist es eine Datei:
Kopiere Datei von from nach to,
gehe zu "solange adf nicht leer".

Soweit alles ok/verständlich?

Danke!
Ja ist es danke danke danke!
AUch wenn ein JFileChooser doch nicht nötig gewesen werde.
:slight_smile:

Ist zwar albern, aber ich muss in meine Signatur schreiben, dass nicht mehr auf 50, 59, 55 und 40 geantwortet werden soll (Uhrzeit), das erinnert mich zu sehr an schlechte Noten.^^

In copy( hätte man auch copy(File… fromTo) schreiben können, um das Array direkt an die Methode/Objekt zu geben. Besser lesbar? Evtl.

Das mit der doppelseitigen Queue/Stack ist so gemeint, dass zB ein Breitendurchlauf oder Tiefendurchlauf (Traversierung [ohne Rekursion]).

Mal noch so nebenbei :

es genügt wenn man grundsätzlich “/” nutzt, da “//” wie schon erwähnt keinen sinn macht und “\” nur unter Windows funktioniert.
Nutzt man hingegen einfach nur “/” läuft dies sowohl unter Unix als auch unter Windows da Java intern unter Windows aus einer Pfad-Angabe mit “/” am Ende korrekt mit “” arbeitet.

Aber nur so am Rande im Sinne der Plattformunabhängigkeit die Java einem bietet. Wenn man es schon nutzen will muss man es auch richtig schreiben.

Okay danke für eure Tipps

[QUOTE=Sen-Mithrarin]Mal noch so nebenbei :

es genügt wenn man grundsätzlich “/” nutzt, da “//” wie schon erwähnt keinen sinn macht und “\” nur unter Windows funktioniert.
Nutzt man hingegen einfach nur “/” läuft dies sowohl unter Unix als auch unter Windows da Java intern unter Windows aus einer Pfad-Angabe mit “/” am Ende korrekt mit “” arbeitet.

Aber nur so am Rande im Sinne der Plattformunabhängigkeit die Java einem bietet. Wenn man es schon nutzen will muss man es auch richtig schreiben.[/QUOTE]

Man kann auch File.separator nehmen.

Alles klar

Lg Blackbyte

Gesendet von meinem iPod touch mit Tapatalk