# .txt Datei "einlesen "und in String speichern ergibt immer NULL



## JavaGamer (27. Jan 2014)

Hallo, ich versuche ein kleines Update Tool zu schreiben, allerdings gibt mir dieses Tool immer wieder "null"
aus, egal was ich versuche.

Dieses Tool liest zwei Textdatein, speichert den Inhalt dieser als String und wandelt diesen später in einen Integer um. (die Links die zum Downloaden der Text-Datei verwendet werden habe ich hier entfernt, da diese privat sind").
Ich habe auch schon im Internet so einiges zu diesem Thema gefunden, aber es kam immer der selbe Fehler bei raus...

Für alle die nicht so viel Code lesen wollen (der Teil der nicht funktioniert (müsste dieser sein)

```
try
        {
        	FileReader filereader = new FileReader ("NewVersions.txt");
        	BufferedReader reader = new BufferedReader (filereader);
        	while ((zeile = reader.readLine()) != null)
        	{
        		zeile = reader.readLine();
        	}
        	reader.close();
        }
        catch (Exception leseFehler){System.err.println(leseFehler);
        };
```
(Datei wird ausgelesen, Inhalt in einen String gespeichert, der String später in einen Integer umgewandelt und dann zwei Integer miteinander vergliechen, welcher der größere ist, allerdings öffnet sich direkt nach dem download der 1 datei ein fenster mit der Meldung: "null" anstatt das der Inhalt der Datei ausgelesen wird und mit einem anderen Integer verglichen wird)

Hier ist mein Code:


Spoiler





```
package volcanoplayer.main;

import java.awt.Cursor;
import java.awt.FlowLayout;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class Main extends JFrame
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private static JLabel updateAvaible;
	private static JLabel updateAvaible2;
	private static JLabel noUpdates;
	private static JLabel checking;
	
	private static JProgressBar current;
	private static JProgressBar current2;
	
	private static boolean update;
	private static boolean noupdate;
	
	private static boolean fileExists;
	
	private static String zeile = null;
	private static String zeile2 = null;

	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws Exception
	{
		Main.update = false;
		Main.noupdate = false;
		Main.fileExists = true;
		String site = "";
		String filename="NewVersions.txt";
		String versionname="Versions.txt";
		JFrame frm=new JFrame();
		current = new JProgressBar(0, 100);
		current.setSize(50,50);
		current.setValue(0);
		current.setStringPainted(true);
		
		current2 = new JProgressBar(0, 100);
		current2.setSize(50, 50);
		current2.setValue(0);
		current2.setStringPainted(true);
		
        try
        {
        	FileReader filereader = new FileReader ("NewVersions.txt");
        	BufferedReader reader = new BufferedReader (filereader);
        	while ((zeile = reader.readLine()) != null)
        	{
        		zeile = reader.readLine();
        	}
        	reader.close();
        }
        catch (Exception leseFehler){System.err.println(leseFehler);
        }; 
        try 
        {
        	FileReader filereader = new FileReader ("Versions.txt");
        	BufferedReader reader = new BufferedReader (filereader);
        	while ((zeile2 = reader.readLine()) != null)
        	{
        		zeile2 = reader.readLine();
        	}
        	reader.close();
        }
            catch (Exception leseFehler){System.err.println(leseFehler);};
		
		updateAvaible = new JLabel("One or more new Updates were found. ");
		updateAvaible2 = new JLabel("Update on progress ... ");
		
		noUpdates = new JLabel("No new Updates were found! ");
		checking = new JLabel("Checking for Updates ... ");
		
		// checks if the file exists
		File files = new File("SLE.exe");
		if(!files.isFile())
			Main.fileExists = false;
		
		// add everything to the window
		if(update == true || fileExists == false)
		{
			frm.removeAll();
			frm.add(current2);
			frm.add(updateAvaible);
			frm.add(updateAvaible2);
		}
		else if(update == false && noupdate == true)
		{
			frm.removeAll();
			frm.add(noUpdates);
		}
		else if(update == false && noupdate == false)
		{
			frm.add(checking);
			frm.add(current);
		}
		frm.setCursor(Cursor.WAIT_CURSOR);
		frm.setVisible(true);
		frm.setLayout(new FlowLayout());
		frm.setSize(400, 200);
		frm.setDefaultCloseOperation(EXIT_ON_CLOSE);
		try 
		{
			URL url=new URL(site);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			int filesize = connection.getContentLength();
			float totalDataRead = 0;
				java.io.BufferedInputStream in = new java.io.BufferedInputStream(connection.getInputStream());
				java.io.FileOutputStream fos = new java.io.FileOutputStream(filename);
				java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
				byte[] data = new byte[1024];
				int i = 0;
				while((i = in.read(data,0,1024))>=0)
				{
					totalDataRead = totalDataRead + i;
					bout.write(data,0,i);
					float Percent=(totalDataRead*100)/filesize;
					current.setValue((int)Percent);
				}  
				bout.close();
				in.close();
				
				Main.newVersionCheck(filename);
				Main.currentVersionChecker(versionname);
				Main.checkAndDownload();
		}
		catch(Exception e)
		{
			javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
					null,e.getMessage(), "Error",
					javax.swing.JOptionPane.DEFAULT_OPTION);
		}
	}
	
	private static void newVersionCheck(String datName)
	{
		File file = new File(datName);
		
		if (!file.canRead() || !file.isFile())
			System.exit(0);
		
		BufferedReader in = null;
		
        try
        {
        	in = new BufferedReader(new FileReader(datName));
        	while ((zeile = in.readLine()) != null) 
        	{
        		zeile = in.readLine();
        	}
        } 
        catch (IOException e) 
        {
        	e.printStackTrace();
        }
        finally 
        {
        	if (in != null)
        	{
        		try 
        		{
        			in.close();
        		} 
        		catch (IOException e)
        		{
        			JOptionPane.showMessageDialog(null, e.getMessage());
                }
        	}
        }
	}
	
	private static void currentVersionChecker(String datName)
	{
		File file = new File(datName);
		
		if (!file.canRead() || !file.isFile())
			System.exit(0);
		
		BufferedReader in = null;
		
        try
        {
        	in = new BufferedReader(new FileReader(datName));
        	while ((zeile2 = in.readLine()) != null) 
        	{
        		zeile2 = in.readLine();
        	}
        } 
        catch (IOException e) 
        {
        	e.printStackTrace();
        }
        finally 
        {
        	if (in != null)
        	{
        		try 
        		{
        			in.close();
        		} 
        		catch (IOException e)
        		{
        			JOptionPane.showMessageDialog(null, e.getMessage());
                }
        	}
        }
	}
	
	private static void checkAndDownload()
	{
		int newVLine = Integer.parseInt(zeile);
		int currentVLine = Integer.parseInt(zeile2);
		String site2 = "";
		String filenames="SLE.exe";
		String site = "";
		String versionname="Versions.txt";
		
		if(newVLine > currentVLine)
		{
			Main.update = true;
			try
			{
				URL url2=new URL(site2);
				HttpURLConnection connection3 = (HttpURLConnection) url2.openConnection();
				int filesizes = connection3.getContentLength();
				float totalDataRead2 = 0;
					java.io.BufferedInputStream in2 = new java.io.BufferedInputStream(connection3.getInputStream());
					java.io.FileOutputStream fos2 = new java.io.FileOutputStream(filenames);
					java.io.BufferedOutputStream bout2 = new BufferedOutputStream(fos2,1024);
					byte[] data3 = new byte[1024];
					int i2 = 0;
					while((i2 = in2.read(data3,0,1024))>=0)
					{
						totalDataRead2 = totalDataRead2 + i2;
						bout2.write(data3,0,i2);
						float Percent=(totalDataRead2*100)/filesizes;
						Main.current.setValue((int)Percent);
					}  
					bout2.close();
					in2.close();
					
					try
					{
						URL url3=new URL(site);
						HttpURLConnection connection2 = (HttpURLConnection) url3.openConnection();
						int filesizes2 = connection2.getContentLength();
						float totalDataRead3 = 0;
							java.io.BufferedInputStream in3 = new java.io.BufferedInputStream(connection2.getInputStream());
							java.io.FileOutputStream fos3 = new java.io.FileOutputStream(versionname);
							java.io.BufferedOutputStream bout3 = new BufferedOutputStream(fos3,1024);
							byte[] data2 = new byte[1024];
							int i3 = 0;
							while((i3 = in3.read(data2,0,1024))>=0)
							{
								totalDataRead3 = totalDataRead3 + i3;
								bout3.write(data2,0,i3);
								float Percent=(totalDataRead3*100)/filesizes2;
								Main.current.setValue((int)Percent);
							}  
							bout3.close();
							in3.close();
							Runtime.getRuntime().exec("SLE.exe");
					}
					catch(Exception e)
					{
						javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
								null,e.getMessage(), "Error",
								javax.swing.JOptionPane.DEFAULT_OPTION);
					}
			}
			catch(Exception e)
			{
				javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
						null,e.getMessage(), "Error",
						javax.swing.JOptionPane.DEFAULT_OPTION);
			}
		}
		else if(newVLine == currentVLine)
		{
			Main.update = false;
			Main.noupdate = true;
		}
		else
		{
			Main.update = false;
			JOptionPane.showMessageDialog(null, "There was an error during checking for updates.");
			System.exit(ERROR);
		}
	}
}
```




Ich hoffe ihr könnt mir helfen.


----------



## JavaMeister (27. Jan 2014)

Ich habe keine Lust das zu lesen  und dann noch raten , welcher Fehler wo kommt ..

ich sage es nur, damit du nicht zu lange auf eine Antwort warten musst...


----------



## JavaGamer (27. Jan 2014)

JavaMeister hat gesagt.:


> Ich habe keine Lust das zu lesen  und dann noch raten , welcher Fehler wo kommt ..
> 
> ich sage es nur, damit du nicht zu lange auf eine Antwort warten musst...


Ich habe jetzt mal den Teil des Codes nochmal rauskopiert, der meiner Meinung nach nicht funktioniert.


----------



## kaoZ (27. Jan 2014)

```
zeile
```

Deklarierst du Außerhalb ? Instanzvariable ? oder vergessen zu deklarieren/initialisieren ?


----------



## JavaMeister (27. Jan 2014)

ohne debugger hast du hier keine chance.

Ich tippe (riesige Glaskugel) auf "NPE" irgentwo zwischen zeile 10 und 200.


----------



## JavaGamer (27. Jan 2014)

kaoZ hat gesagt.:


> ```
> zeile
> ```
> 
> Deklarierst du Außerhalb ? Instanzvariable ? oder vergessen zu deklarieren/initialisieren ?




```
private static String zeile = null;
private static String zeile2 = null;
```
Danach kommt dann die main Methode und darunter noch weitere Methoden, die diese beiden Strings verwenden und dann als Integer umwandeln und vergleichen, welcher größer ist. (Die anderen Methoden werden aber erst aufgerufen, nachdem die Datein ausgelesen wurden ...)
Falls du mehr Infos brauchst, dies alles steht auch oben in meinem Post im Spoiler.


----------



## JavaGamer (27. Jan 2014)

Hat irgendjemand noch eine Idee?
Habe jetzt mal eben ein klein wenig Code umgeschrieben und erhalte nun diesen Fehler:


```
Exception in thread "main" java.lang.NumberFormatException: null
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at volcanoplayer.main.Main.checkAndDownload(Main.java:249)
	at volcanoplayer.main.Main.main(Main.java:152)
```

Hier der Code:

```
private static void currentVersionChecker(String datName)
	{
		File file = new File(datName);
		
		if (!file.canRead() || !file.isFile())
			System.exit(0);
		
		BufferedReader in = null;
		
        try
        {
        	in = new BufferedReader(new FileReader(datName));
        	while ((zeile2 = in.readLine()) != null) 
        	{
        		zeile2 = in.readLine();
        	}
        } 
        catch (IOException e) 
        {
        	e.printStackTrace();
        }
        finally 
        {
        	if (in != null)
        	{
        		try 
        		{
        			in.close();
        		} 
        		catch (IOException e)
        		{
        			JOptionPane.showMessageDialog(null, e.getMessage());
                }
        	}
        }
	}
```
Hier ist der Codeausschnitt aus Zeile 249 (Die Zeile 152 ruft den Code in dieser Zeile auf):
[JAVA=249]
		int currentVLine = Integer.parseInt(zeile2);
[/code]


----------



## X5-599 (28. Jan 2014)

Also, ich nehme mal na du hast in den Textdateien jeweils eine Zeile drin stehen und willst diese auslesen und anschliessend in einen Integer wandeln. Dann darfst du sowas nicht machen:


```
while ((zeile2 = in.readLine()) != null)
{
    zeile2 = in.readLine();
}
```

Was passiert: Als erstes wird die erste Zeile eingelesen und überprüft, ob sie != null ist. Sollte das so sein (wenn es tatsächlich eine Zeile in der Textdatei gibt) wird der Text in "zeile2" gespeichert und der Schleifenkörper wird ausgeführt. Und hier wird wieder versucht die nächste Zeile aus der Textdatei zu lesen. Wenn du aber nur eine einzige Zeile drinstehen hattest wird nun in "zeile2" eine null gespeichert.
Danach wird wieder im Schleifenkopf versucht die nächste Zeile in "zeile2" zu speichern. Ist logischerweise wieder null. Schleifen Eintrittsbedingung ist nicht mehr erfüllt und die Schleife ist zu Ende.

Du hast also dreimal eine neue Zeile eingelesen und so die schon beim ersten mal vorhandene Zeile zweimal überschieben mit null.

Wenn du nur eine Zeile einlesen möchtest müsste ein "zeile2 = in.readLine();" reichen. Wenn du mehrere Zeilen einelsen willst, geht das z.B. so:


```
StringBuilder sb = new StringBuilder();
String zeile2 = null:
while ((zeile2 = in.readLine()) != null)
{
    //mach was mit zeile2
    //z.B.
    sb.append(zeile2);
    sb.append("\n");
}

//Der gesamte Inhalt steht jetzt (inkl Zeilenumbrüche) in dateiInhalt
String dateiInhalt = sb.toString();
System.out.println(dateiInhalt);
```


----------



## JavaGamer (28. Jan 2014)

X5-599 hat gesagt.:


> Also, ich nehme mal na du hast in den Textdateien jeweils eine Zeile drin stehen und willst diese auslesen und anschliessend in einen Integer wandeln. Dann darfst du sowas nicht machen:
> 
> 
> ```
> ...



Also ich möchte nur eine Zeile auslesen, da ich in beiden .txt Dateien eine einzige Zahl drin stehen habe und dann vergleichen möchte, welche größer ist um falls die der NewVersions.txt größer ist das Programm (eine andere Java-Anwendung) geupdatet wird.

Danke, aber dein Code hat nicht geholfen. Da ich nur eine Zeile auslesen will, habe ich jetzt wie du geschrieben hast nur  
	
	
	
	





```
zeile2 = in.readLine();
```
 verwendet, jedoch passiert jetzt garnichts mehr nachdem die Datei gedownloaded wurde. Kein Fehler, das Fenster wird nicht mehr richtig angezeigt (blackscreen mit einem winzigen grauen balken ganz oben links), manchmal wird dies aber doch noch gerendert (1 mal bisher).


----------



## kaoZ (28. Jan 2014)

> Also ich möchte nur eine Zeile auslesen,



Warum dann 


```
while ((zeile2 = in.readLine()) != null)
{
    zeile2 = in.readLine();
}
```

?

Damit ließt du aber alle Zeilen im Dokument aus , bis eben keine mehr vorhanden sind, und nicht nur eine Zeile .

Deine NPE entsteht irgendwo beim Parsen der *Zeilen!*, demnach solltest du vielleicht mal debuggen und schauen wann und wo eben diese NPE entsteht ....

btw. wenn du versuchtst das hier auf "hallo...." auf einen Integer zu parsen wird ebenfalls eine Exception geworfen , verwendest du Try/Catch Blöcke fürs Parsen ?

ich würde an deiner Stelle man mit dem Debugger Zeile für Zeile einlesen lassen (bzw. die eine Zeile) einlesen lassen und schauen wo er die NPE wirft. anders wirst du es eh nicht rausfinden


----------



## JavaGamer (28. Jan 2014)

kaoZ hat gesagt.:


> Warum dann
> 
> 
> ```
> ...



Deshalb habe den Code nun auch so angepasst:

```
private static void newVersionCheck(String datName)
	{
		File file = new File(datName);
		
		if (!file.canRead() || !file.isFile())
			System.exit(0);
		
		BufferedReader in = null;
		
        try
        {
        	in = new BufferedReader(new FileReader(datName));
        	
        	//while ((zeile = in.readLine()) != null) 
        	zeile = in.readLine();
        } 
        catch (IOException e) 
        {
        	e.printStackTrace();
        }
        finally 
        {
        	if (in != null)
        	{
        		try 
        		{
        			in.close();
        		} 
        		catch (IOException e)
        		{
        			JOptionPane.showMessageDialog(null, e.getMessage());
                }
        	}
        }
	}
```

Also das Debuggen hat nur ein 
	
	
	
	





```
ArrayIndexOutOfBoundException: caught and uncaught
```
.
Wo und warum dieser Fehler auftritt und wie ich diesen beheben kann weiss ich aber trozt Breakpoints immer noch nicht.


----------



## kaoZ (28. Jan 2014)

Ich hab in deinem Code kein Array gesehen ?!

falls du eines Verwendest, ersetze dies mal durch eine ArrayList, oder vergrößer dein Array, bzw. was genau speicherst du in dem Array ?

ist 
	
	
	
	





```
zeile
```

ein Array ?

ggf. nicht initialisiert ? also 
	
	
	
	





```
null
```


----------



## X5-599 (28. Jan 2014)

@JavaGamer dann probier mal mein zweites Code Beispiel und lass dir so den gesamten Inhalt der Dateien ausgeben.


----------



## kaoZ (28. Jan 2014)

Sonst versuch einfach mal das hier 


```
String line = "";
		
BufferedReader reader = new BufferedReader(new FileReader(deinFile));
		
line = reader.readLine();
		
System.out.println(line);
```

und schau was genau er ausgibt


----------



## JavaGamer (28. Jan 2014)

kaoZ hat gesagt.:


> Sonst versuch einfach mal das hier
> 
> 
> ```
> ...


er gibt 2 mal "1 " aus (direkt nach der 1 eine Leertaste)


X5-599 hat gesagt.:


> @JavaGamer dann probier mal mein zweites Code Beispiel und lass dir so den gesamten Inhalt der Dateien ausgeben.


Dann kommt einfach nur 2 mal "1 " raus mit Zeilenumbruch dazwischen.


kaoZ hat gesagt.:


> Ich hab in deinem Code kein Array gesehen ?!
> 
> falls du eines Verwendest, ersetze dies mal durch eine ArrayList, oder vergrößer dein Array, bzw. was genau speicherst du in dem Array ?
> 
> ...


zeile ist ein String, der später in einen Integer umgewandelt wird, mit 
	
	
	
	





```
newVLine = Integer.parseInt(zeile);
```
 Im Code gibt es keinen einzigen Array, nur einen String, der später in einen Integer umgewandelt wird um mit einer If Abfrage vergleicht zu werden.


----------



## X5-599 (28. Jan 2014)

Wenn ein Fehler geworfen wird, wird doch auch die Zeilennummer angegeben wo er aufgetreten ist. Ansonsten kannst du es bei den ausgelesenen Strings auch mal mit einem .trim() versuchen.


----------



## JavaGamer (28. Jan 2014)

X5-599 hat gesagt.:


> Wenn ein Fehler geworfen wird, wird doch auch die Zeilennummer angegeben wo er aufgetreten ist. Ansonsten kannst du es bei den ausgelesenen Strings auch mal mit einem .trim() versuchen.



So wirklich ein Fehler kommt da ja nicht. Nur im Debug Modus unter Breakpoints steht dann
"ArrayIndexOutOfBoundsException: caught and uncaught". Aber kein Hinweis wo und im ganz normalen Java Modus passiert rein garnichts, ausser das sich ein schwarzes Fenster öffnet mit einem linken Balken oben.
In der Console wird auch nur

```
1 
1
```
ausgegeben, da ich ein System.out.println() eingebaut wird.
(1, dann leerzeichen, also nicht nur eine 1 sondern ein leerzeichen danach)


----------



## JavaGamer (28. Jan 2014)

Endlich. Ich habe den Fehler gefunden.
Danke an alle, die mir dabei geholfen haben.

Für alle die dieses Problem auch haben, ihr müsst die Zeile zum auslesen der Datei ändern, in diese:


```
while ((zeile = in.readLine()) != null) 
        	{

    			currentVLine = Integer.parseInt(zeile);
        	}
```

Wie simpel manche Fehler nur sein können und wie lange man braucht um diesen zu finden und auf die Idee zu kommen. 

Warum das Fenster nicht richtig angezeigt wurde, kann ich leider auch nicht sagen/schreiben, ich habe
einfach nur von dieser Zeile die Zahlen nochmal neu eingegeben (genauso wie vorher auch) und auf einmal lief es wieder:


```
frm.setSize(300, 150);
```

Danke an alle.
JavaGamer


----------

