Programm läuft nicht! Warum?

  • Themenstarter Themenstarter LexDanny
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

LexDanny

Gast
Hallo!

Ich habe folgendes Java-Prog geschrieben. Allerdings gibt es ein Problem mit der Ausgabe in der Methode open. Ich erhalte eine NullPointerException(für Zeile 65), weiß aber nicht wieso!
Die Datei passwd.txt sieht so aus(hier nur die 1. Zeile
Code:
stiebitz:CFzc0M/4oDZa.:5316:5100:Ralf Stiebitz:/home/stud/2006/stiebitz:/bin/bash

Das Problem müsste sich in Zeile 53 und 65-71 liegen. Allerdings weiß ich nicht, wie ich es besser machen könnte!


Schon mal danke im vorraus!
Lex

Code:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Account
{
	public static int index;
	public int uid;
	public int gid;
	public String login_name;
	public String password, user_name, directory, shell;
	
	public static void main(String[] args) 
	{
		open("passwd.txt");
	}
	
	Account(String login_name, String password, String uid, String gid, String user_name, String directory, String shell)
	{
		this.login_name=login_name;
		this.password=password;
		this.uid=Integer.parseInt(uid);
		this.gid=Integer.parseInt(gid);
		this.user_name=user_name;
		this.directory=directory;
		this.shell=shell;
	}
	
	public static Account[] open(String filename)
	{
		index=0;
		Vector<Account> list=new Vector<Account>();
	
		try {
			BufferedReader in = new BufferedReader(
				new InputStreamReader(
						new FileInputStream(filename)) );
			
			String s;
			while ((s=in.readLine())!=null)
			{
				StringTokenizer tokenizer=new StringTokenizer(s, ":");		
				String login_name=	tokenizer.nextToken();
				String password=	tokenizer.nextToken();
				String uid=	tokenizer.nextToken();
				String gid=	tokenizer.nextToken();
				String user_name=	tokenizer.nextToken();
				String directory=	tokenizer.nextToken();
				String shell=	tokenizer.nextToken();
				list.add(index, new Account(login_name, password, uid, gid, user_name, directory, shell));
				index=index+1;
			}
			in.close();				
			} catch (FileNotFoundException e) {
			e.printStackTrace();
			} catch (IOException e) {
			e.printStackTrace();}
			Account[] result=new Account[list.size()];
			int i=0;
			while (i!=(index-1))
			{
				result[i].login_name=list.elementAt(i).login_name;
				result[i].password=list.elementAt(i).password;
				result[i].uid=list.elementAt(i).uid;
				result[i].gid=list.elementAt(i).gid;
				result[i].user_name=list.elementAt(i).user_name;
				result[i].directory=list.elementAt(i).directory;
				result[i].shell=list.elementAt(i).shell;
				i=i+1;
			}
		return result;

	}
}
 
simpler Fehler, deine result-Einträge sind nicht initialisiert ... du hast zwar das Array mit der Größe angelegt, aber die Inhalte des Arrays selbst sind alle samt null

Code:
public class Test {
	
	public static void main(String[] args) {
		java.util.Vector<Person> vec = new java.util.Vector<Person>();	
		
		vec.add(new Person("Meier"));
		
		Person[] result = new Person[vec.size()];
		
		result[0] = new Person("unnamed"); //ohne gehts nicht
		
		result[0].name = vec.elementAt(0).name;
	}
}

-------

public class Person {
	
	public String name; //macht man zwar nich aber zur Demonstration
		
	public Person(String name) {
		this.name = name;
	}
}
 
Der Vollständigkeit halber:

Code:
something[] x = new something[y];

erzeugt dir sozusagen einen Container/Schrank/nenne es wie du willst, der y Elemente
fassen kann. Und zwar vom Typ "something". Aber der is anfangs leer.
D.h. something[0<x<y] kann ein leeres Fach sein, also ein Element vom Typ "null" enthalten.
Soweit ist das eigentlich kein Problem, aber wenn du nun versuchst, etwas mit nichts zu tun,
dann kriegst du ein Problem, und zwar eine Null-Pointer-Exception.
 
der vollständigkeit halber 2.0 😉

bei arrays die aus elementaren Datentypen bestehen (int, byte, short, long, boolean, char, float, double) sind die array-einträge nach erstellung. z.b. durch:
Code:
boolean[] b = new boolean[3];

nicht "null", sondern sie haben den standart-wert des jeweiligen datentyps. hier: datentyp: "boolean" - standartwert: "false"...

gruß,
michael
 
Okay danke. Soweit funktioniert das ganze. Nur jetzt soll ich das ganze per assert testen.

Witziger weise gibt er für Zeile 11 false aus, aber bei der Assertion passiert überhaupt nichts, obwohl die Aussage ja falsch ist. *wunder* Warum?



Code:
import java.util.Vector;

public class AccountTest {

	public static void main(String[] args) {
		Account Acc[];
		Acc=Account.open("passwd.txt");
		// UID des 1. Nutzers ist 5316
		int uid1=5326;
		System.out.println(uid1==Acc[0].uid);
		assert uid1==Acc[0].uid : "Die UID ist nicht 5316!";
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben