warum bekomme ich hier eine NullPointerException

Diskutiere warum bekomme ich hier eine NullPointerException im Allgemeine Java-Themen Bereich.
Bitte aktiviere JavaScript!
Drachenbauer

Drachenbauer

Damit möchte ich effizienter große Mengen einander ähnliche Dateien für ein anderes Projekt erstellen:
Java:
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;

public class JsonFileCreateHelper
{
    static File dir1 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\blockstates");
    static File dir2 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\block");
    static File dir3 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\item");
    static File dir4 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\data\\flattilesmod\\recipes");
       
    static ArrayList<File> list1 = new ArrayList<File>(Arrays.asList(dir1.listFiles()));
    static ArrayList<File> list2 = new ArrayList<File>(Arrays.asList(dir2.listFiles()));
    static ArrayList<File> list3 = new ArrayList<File>(Arrays.asList(dir3.listFiles()));
    static ArrayList<File> list4 = new ArrayList<File>(Arrays.asList(dir4.listFiles()));
   
    public static void main(String[] args) throws IOException
    {
        int i;
       
        /*for (i = 0; i < list1.size(); i++)
        {
            File dir = list1.get(i);
            createFile(dir1, dir.getName(), "glazed_");
        }
       
        for (i = 0; i < list2.size(); i++)
        {
            File dir = list2.get(i);
            createFile(dir2, dir.getName(), "glazed_");
        }
       
        for (i = 0; i < list3.size(); i++)
        {
            File dir = list3.get(i);
            createFile(dir3, dir.getName(), "glazed_");
        }*/
       
        for (i = 0; i < list4.size(); i++)
        {
            File dir = list4.get(i);
            createFile(dir4, dir.getName(), "glazed_");
        }
    }
   
    public static void createFile(File dir, String name, String subString)
    {
        if( name.contains("concrete") && name.endsWith(".json"))
        {
            try
            {
                //writeFile(dir, rename(name, subString), rename(readFile(name), subString));
                writeFile(dir, name.replace("concrete", "terracotta"), readFile(name).replace("concrete", "terracotta"));
                //copy (dir, new File (dir1, rename(dir.getName(), subString)));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
   
  /*@SuppressWarnings("unused")
    private static void copy(File source, File destination) throws IOException
    {
        long length = source.length();
        @SuppressWarnings("resource")
        FileChannel input = new FileInputStream(source).getChannel();
       
        try
        {
            @SuppressWarnings("resource")
            FileChannel output = new FileOutputStream(destination).getChannel();
           
            try
            {
                for (long position = 0; position < length; )
                {
                    position += input.transferTo(position, length-position, output);
                }
            }
            finally
            {
                output.close();
            }
        }
        finally
        {
            input.close();
        }
    }*/
   
    @SuppressWarnings("resource")
    public static String readFile(String filename) throws IOException
    {
        File file = new File(filename);
        int len = (int) file.length();
        byte[] bytes = new byte[len];
        FileInputStream fis = null;
       
        try
        {
            fis = new FileInputStream(file);
            assert len == fis.read(bytes);
        }
        catch (IOException e)
        {
            close(fis);
            throw e;
        }
        return new String(bytes, "UTF-8");
    }
   
    public static String rename (String source, String part)
    {
        String new_content = new String();
        int i;
        for (i = 0; i < source.length(); i++)
        {
            new_content += source.charAt(i);
           
            if (source.charAt(i) == '_' && source.charAt(i + 1) == 't'&& source.charAt(i + 2) == 'e' && source.charAt(i + 1) == 'r')
            {
                new_content += part;
            }
        }
        return new_content;
    }
   
    public static void writeFile(File file, String filename, String text) throws IOException
    {
        Path path = file.toPath();
       
        OutputStream os = null;
        try
        {
            os = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW);
            os.write(text.getBytes("UTF-8"));
        }
        catch (IOException e)
        {
            close(os);
            throw e;
        }
    }
   
    public static void close(Closeable closeable)
    {
        try
        {
            closeable.close();
        }
        catch (IOException ignored)
        {
           
        }
    }
}
Aber wenn ich versuche, es laufen zu lassen, kommt der hier in der Konsole:
Exception in thread "main" java.lang.NullPointerException
at JsonFileCreateHelper.close(JsonFileCreateHelper.java:158)
at JsonFileCreateHelper.readFile(JsonFileCreateHelper.java:115)
at JsonFileCreateHelper.createFile(JsonFileCreateHelper.java:60)
at JsonFileCreateHelper.main(JsonFileCreateHelper.java:49)
Könnt ihr mir helfen, den Fehler zu finden?
Es ist nichts im code rot unterstrichen.
 
J

JustNobody

Dann debug es doch einmal im Detail. Meine Vermutung ist, dass Du in readFile eine Datei versuchst zu lesen, die nicht existiert. Daher ist fis null und in close kommt dann die NPE.
 
Drachenbauer

Drachenbauer

es soll die Dateien lesen, die in den oben angegebenen Dateipfaden gespeichert sind.
Und da sind Dateien drin, deren Name die Begriffe enthält, die in der Methode "createFile" angegeben sind.
 
T

temi

es soll die Dateien lesen, die in den oben angegebenen Dateipfaden gespeichert sind.
Und da sind Dateien drin, deren Name die Begriffe enthält, die in der Methode "createFile" angegeben sind.
Das ist schön, ändert aber nichts an
Dann debug es doch einmal im Detail.
Es ist nichts im code rot unterstrichen.
Fehler, die im Code rot unterstrichen werden, führen i.d.R. zu Compilefehlern, d.h. der Code kann nicht kompiliert werden.

Eine Exception ist ein Laufzeitfehler, d.h. das Programm ist compiliert und läuft, bis ein Fehler auftritt, z.B. irgendeine Instanz ist null. Da hilft halt nur Debuggen, wenn man es nicht anhand der Angaben in der Exception sehen kann.
 
Drachenbauer

Drachenbauer

Ich habe es jetzt so verändert, dass readFile direkt ein File object als input bekommt.

Aber jetzt habe ich gemerkt, dass ich in "writeFile" zwar den Inhalt der Datei, aber nicht den angepassten Dateinamen benutzt habe...
Andere Beispiele, die ich im internet finde, erstellen zwar eine Datei mit gewünschtem Namen im gewünschten Ordner, fügen dieser aber wiederum keinen Inhalt hinzu.

Gibt es einen Weg, das alles zu nutzen, Also Im gewünschten Ordner eine Datei mit gewünschtem Namen und gewünschtem Inhalt zu erstellen?

In "writeFile" kommen alle 3 Informationen an, also möchte ich sie dort auch alle benutzen.

Java:
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Arrays;

public class JsonFileCreateHelper
{
    static File dir1 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\blockstates");
    static File dir2 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\block");
    static File dir3 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\item");
    static File dir4 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\data\\flattilesmod\\recipes");
      
    static ArrayList<File> list1 = new ArrayList<File>(Arrays.asList(dir1.listFiles()));
    static ArrayList<File> list2 = new ArrayList<File>(Arrays.asList(dir2.listFiles()));
    static ArrayList<File> list3 = new ArrayList<File>(Arrays.asList(dir3.listFiles()));
    static ArrayList<File> list4 = new ArrayList<File>(Arrays.asList(dir4.listFiles()));
  
    public static void main(String[] args) throws IOException
    {
        int i;
      
        /*for (i = 0; i < list1.size(); i++)
        {
            File dir = list1.get(i);
            createFile(dir1, dir, "glazed_");
        }
      
        for (i = 0; i < list2.size(); i++)
        {
            File dir = list2.get(i);
            createFile(dir2, dir, "glazed_");
        }
      
        for (i = 0; i < list3.size(); i++)
        {
            File dir = list3.get(i);
            createFile(dir3, dir, "glazed_");
        }*/
      
        for (i = 0; i < list4.size(); i++)
        {
            File dir = list4.get(i);
            createFile(dir4, dir, "glazed_");
        }
    }
  
    public static void createFile(File dir, File file, String subString)
    {
        String name = file.getName();
      
        if( name.contains("concrete") && name.endsWith(".json"))
        {
            try
            {
                //writeFile(dir, rename(name, subString), rename(readFile(name), subString));
                writeFile(dir, name.replace("concrete", "terracotta"), readFile(file).replace("concrete", "terracotta"));
                //copy (dir, new File (dir1, rename(dir.getName(), subString)));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
  
  /*@SuppressWarnings("unused")
    private static void copy(File source, File destination) throws IOException
    {
        long length = source.length();
        @SuppressWarnings("resource")
        FileChannel input = new FileInputStream(source).getChannel();
      
        try
        {
            @SuppressWarnings("resource")
            FileChannel output = new FileOutputStream(destination).getChannel();
          
            try
            {
                for (long position = 0; position < length; )
                {
                    position += input.transferTo(position, length-position, output);
                }
            }
            finally
            {
                output.close();
            }
        }
        finally
        {
            input.close();
        }
    }*/
  
    @SuppressWarnings("resource")
    public static String readFile(File dir) throws IOException
    {
        int len = (int) dir.length();
        byte[] bytes = new byte[len];
        FileInputStream fis = null;
      
        try
        {
            fis = new FileInputStream(dir);
            assert len == fis.read(bytes);
        }
        catch (IOException e)
        {
            close(fis);
            throw e;
        }
        return new String(bytes, "UTF-8");
    }
  
    public static String rename (String source, String part)
    {
        String new_content = new String();
        int i;
        for (i = 0; i < source.length(); i++)
        {
            new_content += source.charAt(i);
          
            if (source.charAt(i) == '_' && source.charAt(i + 1) == 't'&& source.charAt(i + 2) == 'e' && source.charAt(i + 1) == 'r')
            {
                new_content += part;
            }
        }
        return new_content;
    }
  
    @SuppressWarnings("resource")
    public static void writeFile(File dir, String filename, String content) throws IOException
    {
        /*Path path = dir.toPath();
      
        FileOutputStream os = null;
        try
        {
            os = Files.newFileOutputStream(path, StandardOpenOption.CREATE_NEW);
            os.write(content.getBytes("UTF-8"));
          
            Writer output = null;
            File file = new File(dir, filename);
            output = new BufferedWriter(new FileWriter(file));
        }
        catch (IOException e)
        {
            close(os);
            throw e;
        }*/
    }
  
    public static void close(Closeable closeable)
    {
        try
        {
            closeable.close();
        }
        catch (IOException ignored)
        {
          
        }
    }
}
Ich habe jetzt erstmal den inhalt von "writeFile" auskommentiert, da ich mit diesen Sachen erstmal nicht weiter komme.
Es handelt sich dabei um einen Ansatz, der den Ordner-Pfad (ich weiß nicht, ob ein Path-Objekt einen Dateinamen mit zugewiesen bekommen kann) und den Inhalt für die Datei nutzt, und einen Ansatz, der den Namen und Pfad nutzt, aber keinen Inhalt in die Datei schreibt.
Außerdem bin ich mir nicht sicher, ob der zweite Ansatz tatsächlich eine Datei erstellt, oder nur die vorbereitung dafür ist und noch einen finalen Befehl braucht, den ich dort, wo der Ansatz her ist, bloß nicht gesehen habe.

Es scheint, ich brauche dafür noch einen anderen Ansatz.

Jetzt habe ich das hier versucht (in "writeFile"):
Java:
        Writer output = null;
        File file = new File(dir, filename);
        output = new BufferedWriter(new FileWriter(file));
        output.write(content);
Jetzt hat es mir Dateien mit dem richtigen Namen in den richtigen Ordner geschrieben, aber die sind leer...

Ich habe gerade in "readFile" eine Anweisung hinzugefügt, den Inhalt in die Konsole zu schreiben.
Aber die Konsole bleibt leer.

Also scheint es aus irgendeinem Grund die Datei noch nicht aus zu lesen...
Woran könnte das liegen?
 
Zuletzt bearbeitet:
Drachenbauer

Drachenbauer

Jetzt funktioniert der Reader und der Writer bekommt auch den modfizierten Datei-Inhalt, aber die Dateien bleiben trotzdem leer.
Java:
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;

public class JsonFileCreateHelper
{
    static File dir1 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\blockstates");
    static File dir2 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\block");
    static File dir3 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\assets\\flattilesmod\\models\\item");
    static File dir4 = new File("D:\\Mods\\1_15_1\\FlatTilesMod\\src\\main\\resources\\data\\flattilesmod\\recipes");
       
    static ArrayList<File> list1 = new ArrayList<File>(Arrays.asList(dir1.listFiles()));
    static ArrayList<File> list2 = new ArrayList<File>(Arrays.asList(dir2.listFiles()));
    static ArrayList<File> list3 = new ArrayList<File>(Arrays.asList(dir3.listFiles()));
    static ArrayList<File> list4 = new ArrayList<File>(Arrays.asList(dir4.listFiles()));
   
    public static void main(String[] args) throws IOException
    {
        int i;
       
        /*for (i = 0; i < list1.size(); i++)
        {
            File dir = list1.get(i);
            createFile(dir1, dir, "glazed_");
        }
       
        for (i = 0; i < list2.size(); i++)
        {
            File dir = list2.get(i);
            createFile(dir2, dir, "glazed_");
        }
       
        for (i = 0; i < list3.size(); i++)
        {
            File dir = list3.get(i);
            createFile(dir3, dir, "glazed_");
        }*/
       
        for (i = 0; i < list4.size(); i++)
        {
            File dir = list4.get(i);
            createFile(dir4, dir, "glazed_");
        }
    }
   
    public static void createFile(File dir, File file, String subString)
    {
        String name = file.getName();
       
        if( name.contains("concrete") && name.endsWith(".json"))
        {
            try
            {
                //writeFile(dir, rename(name, subString), rename(readFile(name), subString));
                writeFile(dir, name.replace("concrete", "terracotta"), readFile(file).replace("concrete", "terracotta"));
                //copy (dir, new File (dir1, rename(dir.getName(), subString)));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
   
  /*@SuppressWarnings("unused")
    private static void copy(File source, File destination) throws IOException
    {
        long length = source.length();
        @SuppressWarnings("resource")
        FileChannel input = new FileInputStream(source).getChannel();
       
        try
        {
            @SuppressWarnings("resource")
            FileChannel output = new FileOutputStream(destination).getChannel();
           
            try
            {
                for (long position = 0; position < length; )
                {
                    position += input.transferTo(position, length-position, output);
                }
            }
            finally
            {
                output.close();
            }
        }
        finally
        {
            input.close();
        }
    }*/
   
    @SuppressWarnings("resource")
    public static String readFile(File dir) throws IOException
    {
        Path path = dir.toPath();
        String content = new String(Files.readAllBytes(path), "UTF-8");
        System.out.print("content");
        System.out.print(content);
        return content;
    }
   
    public static String rename (String source, String part)
    {
        String new_content = new String();
        int i;
        for (i = 0; i < source.length(); i++)
        {
            new_content += source.charAt(i);
           
            if (source.charAt(i) == '_' && source.charAt(i + 1) == 't'&& source.charAt(i + 2) == 'e' && source.charAt(i + 1) == 'r')
            {
                new_content += part;
            }
        }
        return new_content;
    }
   
    @SuppressWarnings("resource")
    public static void writeFile(File dir, String filename, String content) throws IOException
    {
        Writer output = null;
        File file = new File(dir, filename);
        output = new BufferedWriter(new FileWriter(file));
        output.write(content);
        System.out.print("content");
        System.out.print(content);
    }
   
    public static void close(Closeable closeable)
    {
        try
        {
            closeable.close();
        }
        catch (IOException ignored)
        {
           
        }
    }
}
Ich habe gerade festgestellt, dass mir noch "output.close();" unter "output.write(content);" gefehlt hat.

Jetzt sind die Inhalte auch korrekt in den Dateien angekommen.
 
Zuletzt bearbeitet:
Thema: 

warum bekomme ich hier eine NullPointerException

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben