Java "null" in String-Array - warum?

MeandXP

Ensign
Registriert
Juli 2009
Beiträge
171
Moin zusammen,

Ich habe das problem dass in folgendem String-Array scheinbar alle Werte mit null initialisiert sind:
Code:
String[] token_container = new String[500];
	System.out.println(token_container[0]);  //Ausgabe: null  
        System.out.println(token_container[1]);  //Ausgabe null, und so weiter....


Das problem ist dass das Array mit Tokens gefüllt werden soll von denen manche hinterher in eine int Variable konvertiert werden sollen, aber statt der reinen zahl z.B. 12 steht bei der Ausabe dann "null12", und dann bekomme ich natürlich Exceptions der Integer.parseint Methode.
Ist es ein Programmierfehler oder muss ich das Problem anders lösen?

Hoffe ihr konntet mir folgen, MeandXP.
 
Null steht ja für eine leere Variable...ansich müsste der die Variable komplett überschreiben mit einem neuen Wert wenn du den einen Wert zuweißt. Wie sieht denn dein Quelltext von der Füllung der Variablen mit Werten aus?
 
Nicht initialisierte Objekte sind i.d.r. auch null solange sie nicht initialisiert werden (wie String s; )

Du kannst nun z.b. in einer einfachen for-Schleifen jedem String des Arrays ein "" zuweisen.

Code:
for(String s: token_container) {
   s = "";
}
 
Zuletzt bearbeitet:
Das ist normal so...leer bedeutet null.

wenn du dein string mit 0 füllen willst würde ich eine for schleife machen, die dir dein string einzeln mit nullen füllt.

gruß
 
wie hast du dein array mit werten befüllt?
Ergänzung ()

for (int i = 0; i< token_container.length; i++) {
token_container = "";
}
 
Du musst die einzelnen Variablen des Feldes noch befüllen.

Code:
String[] token_container = new String[500];
System.out.println(token_container[0]);  // liefert null
token_container[0] = "Hallo";
System.out.println(token_container[0]);  //liefert Hallo
 
oder einfach beim Wertzuweisen so vorgehen:

Code:
String[] arr = new String[10];
Random rdm =  new Random();

int number = rdm.nextInt(100) // liefert Integerzahl von 0 bis 99
arr[0] = "" + number;

System.out.println(arr[0]); // Wert von number

Dann dürfte beim Ausgeben kein null mehr davorstehen.
 
Zuletzt bearbeitet:
Was genau macht die Anwendung denn?
Möglicherweise ist es besser eine andere Collection zu verwenden als ein Array. Das kommt aber darauf an wie du auf die Werte zugreifen können musst (Reihenfolge wichtig? Über Index?) und wie du einfügst (An beliebige Position? Immer am Ende? Immer am Anfang?).

Bei einem Array hast du einen numerischen Index und kannst mit O(1) überall einfügen und zugreifen. Es ist aber fraglich ob das bei deiner Anwendung notwendig ist.

Zudem hast du bei deinem Programm ja offenbar ein Problem mit nicht gesetzten Werten. Bei anderen Collections kannst du einfach über einen Iterator auf alle tatsächlich gesetzten Werte zugreifen.

Wenn wir mehr über deine Anwendung wissen, können wir das beurteilen.
 
Habe das array per while-Schleife mit nichts also "" befüllt. Danach werden diesem Array Tokens einer Textdatei zugewiesen und das drittletzte abgerufen und in int konvertiert, das gesamte programm soll einen Systemstart-zähler darstellen. Reicht das? Sonst könnte ich auch den gesamte Quelltext posten!

Es funktioniert immer noch nicht, hier also der gesamte code im anhang :(
habe die Dateiendung von .java in .txt geändert damit sie anhängbar ist!

mfg, MeandXP.
 

Anhänge

Zuletzt bearbeitet:
MeandXP schrieb:
Habe das array per while-Schleife mit nichts also "" befüllt. Danach werden diesem Array Tokens einer Textdatei zugewiesen und das drittletzte abgerufen und in int konvertiert, das gesamte programm soll einen Systemstart-zähler darstellen. Reicht das? Sonst könnte ich auch den gesamte Quelltext posten!

So richtig viel sagt mir das nicht. Wieso das Drittletzte?
Was steht in der Datei?
Auf welchem Betriebssystem soll das laufen?

Quelltext ist immer gut. Funktioniert es denn jetzt wie gewünscht?
 
@DjNDB: in der Datei sind erstens die anzahl der Startvorgänge, dahinter dann noch Datum und uhrzeit enthalten. Das drittletzte token, also die zahl der starts, wir eingelesen, um eins erhöht und der Datei mit datum und Uhrzeit hinzugefügt!
Code ist im Anhang des vorherigen Posts, MeandXP.
 
zum verständnis vllt noch anmerken:
Strings sind in Java Objekte und die werden immer mit null initialisiert es sei denn du weißt ihnen einen Wert zu

vllt reicht ja auch schon ein substring
 
Wäre es nicht sinnvoll, die gewünschten Daten, also die Anzahl der Startups und das derzeitige Datum, zeilenweise in die Datei zu schreiben?
Somit könntest du das ganze zeilenweise auslesen, das erste Token der Zeile ist dann die Anzahl. Und mit FileWriter.append() kann man auch ganz leicht eine Zeile an eine Datei anhängen.
 
WingX schrieb:
Wäre es nicht sinnvoll, die gewünschten Daten, also die Anzahl der Startups und das derzeitige Datum, zeilenweise in die Datei zu schreiben?

Man könnte sogar einfach nur das Datum zeilenweise speichern. Die Anzahl Starts ergibt sich dann ja aus der Anzahl Zeilen. Das würde die Komplexität des Programms gewaltig verringern und Redundanz entfernen.
 
Die Ideeen (3 e's, wie sieht das denn aus...) sind echt gut, aber irgendwie habe ich das programm einmal zu laufen bekommen! Jetzt geht es maximal ein mal, ich habe das Gefühl dass das schreiben eines Leerzeichens nach dem Datum und der Zeit nicht funktioniert!
Habe den verbesserten Quellcode angehängt.

mfg, MeandXP.
 

Anhänge

Ich muss ehrlich sagen mir fehlt die Motivation mich in den unnötig komplizierten Code reinzudenken.

Kannst du mal die Kernanforderung möglichst genau spezifizieren?
Wenn wirklich nur die Gesamtanzahl der Programmstarts und der jeweilige Timestamp geloggt werden sollen, dann lässt sich das ganze wahrscheinlich schneller sauber neu schreiben als debuggen, indem von Anfang an die Anforderungen berücksichtigt werden.
 
DjNDB schrieb:
Wenn wirklich nur die Gesamtanzahl der Programmstarts und der jeweilige Timestamp geloggt werden sollen

Genau darum gehts, mir fehlt halt die Erfahrung und das ist mein erstes halbwegs sinnvolles Projekt :D
 
wenn ein array erstellt wird, dann wird es mit default werten des array typs initialisiert.

int [] ar=new int[10] hätte z.B. lauter 0er stehen

und afaik ist defaultwert bei einem Objekt, wie z.B. String, null.


kein Kommentar im Sourcecode=>kein Kommentar im Forum ^^
 
hmm kannst du dein String Array nicht überschreiben, so dass du statt den eigentlichen Standardwert deinen eigenen hast :D

So sparst du dir nämlich jede einzelne schleife.
 
Ich hab mal eine Quick+Dirty Variante von dem erstellt wie ich es vorgeschlagen hatte:

Code:
public class StartupCounter
{
	public static void main( String[] args )
	{
		BufferedReader bufferedReader = null;
		PrintWriter printWriter = null;
		try
		{
			printWriter = new PrintWriter( new BufferedWriter( new FileWriter( "count.txt", true ) ) );
			Date date = new Date();
			printWriter.println( date );
		} catch ( FileNotFoundException e )
		{
			e.printStackTrace();
		} catch ( IOException e )
		{
			e.printStackTrace();
		} finally
		{
			if ( printWriter != null )
				printWriter.close();
		}

		try
		{
			bufferedReader = new BufferedReader( new FileReader( "count.txt" ) );

			int count = 0;
			while ( bufferedReader.readLine() != null )
			{
				count++;
			}
			
			System.out.println( "Number of program starts: " + count );

		} catch ( FileNotFoundException e )
		{
			e.printStackTrace();
		} catch ( IOException e )
		{
			e.printStackTrace();
		} finally
		{
			try
			{
				if ( bufferedReader != null )
					bufferedReader.close();
			} catch ( IOException e )
			{
				e.printStackTrace();
			}

		}

	}

}
 

Anhänge

Zurück
Oben