# Exception in thread "main" java.lang.NullPointerException



## Steeeve (20. Jan 2012)

Hallo zusammen,

ich hab eine Fehlermeldung, die mir nach dem was ich im Web so gefunden habe, sagt, dass meine Variable "uebergabe" nicht instanziert wurde.

*Die Fehlermeldung:*

Exception in thread "main" java.lang.NullPointerException
at pruefungneu_package.PRUEFUNGNEUCLASS.main(PRUEFUNGNEUCLASS.java:64)

*Der Quelltext:*

```
//Start Sortierung Tueren
		int m = t;
		double [] uebergabe = new double[m];
		
		for (int i=0; i<=m; i++)
		  {
			uebergabe[i] = Tueren[i].maxwert;
		  }
		
		while (m>0)
		  {
			int k = MaSu(m,uebergabe);
			Tueren[m+1].maxwert = Tueren[k].maxwert;
			Tueren[k].maxwert = Tueren[m].maxwert;
			Tueren[m].maxwert = Tueren[m+1].maxwert;
			m=m-1;
		  }
```

Der Fehler bezieht sich auf die Zeile "uebergabe_ = Tueren.maxwert;".

Würde mich freuen, wenn mir jemand helfen kann.

Eventuell braucht ihr auch mehr Informationen.. dann sagt mir was ihr braucht.

Danke vorab

Gruß
Steeeve_


----------



## Gast2 (20. Jan 2012)

Tueren_ ist null.
Wo wird das Array gefüllt?



		Java:In die Zwischenablage kopieren


for (int i=0; i<=m; i++)

Bist du dir sicher, dass es hier nicht eher i < m heißen müsste?_


----------



## XHelp (20. Jan 2012)

Wo initialisierst du denn 
	
	
	
	





```
Tueren
```
? Außerdem läuft die Schleife eins zu weit


----------



## Steeeve (21. Jan 2012)

Der Wert von Tueren.maxwert ist nicht leer, den kann ich mir ausgeben lassen. Jetzt sollen die Werte nur noch sortiert werden.

hier der Quelltext von oben an: (weiter unten die Unterprogramme)


```
public static void main(String[] args) 
	
	{
		// TODO Auto-generated method stub
		String zeile[] = Einlesen();                              //Daten werden über UP aus Artikel.txt eingelesen
		
		class Artikel
		 {
			String anr;
			String abez;
			String maxbestand;
			String preis;
			Double maxwert;
		 }
		
		Artikel [] Tueren = new Artikel[20];
		Artikel [] Rest = new Artikel[20];
						
		int t = 0;
		int r = 0;
		
		for (int i=0; i<20; i++)
		  {
			if (Integer.parseInt(zeile[i].substring(5,7))==22)
			  {
				Tueren[t] = new Artikel();
				Tueren[t].anr = zeile[i].substring(0,8);
				Tueren[t].abez = zeile[i].substring(9,40);
				Tueren[t].maxbestand = zeile[i].substring(48,52);
				Tueren[t].preis = zeile[i].substring(99,106);
				Tueren[t].maxwert = Integer.parseInt(Tueren[t].maxbestand)*Double.parseDouble(Tueren[t].preis);
				t = t+1;
			  }
			
			else
			  {
				Rest[r] = new Artikel();
				Rest[r].anr = zeile[i].substring(0,8);
				Rest[r].abez = zeile[i].substring(9,40);
				Rest[r].maxbestand = zeile[i].substring(48,52);
				Rest[r].preis = zeile[i].substring(99,106);
				Rest[r].maxwert = Integer.parseInt(Rest[r].maxbestand)*Double.parseDouble(Rest[r].preis);
				r=r+1;
			  }
		  }
		
		//Start Sortierung Tueren
		int m = t;
		double [] uebergabe = new double[m];
		
		for (int i=0; i<=m; i++)
		  {
			uebergabe[i] = Tueren[i].maxwert;
		  }
		
		while (m>0)
		  {
			int k = MaSu(m,uebergabe);
			Tueren[m+1].maxwert = Tueren[k].maxwert;
			Tueren[k].maxwert = Tueren[m].maxwert;
			Tueren[m].maxwert = Tueren[m+1].maxwert;
			m=m-1;
		  }



//Unterprogramm Maximumsuche
	public static int MaSu(int n, double [] v)
	{
		int k=0;
		double max = v[0];
		
		for (int i=1; i<=n; i++)
		{
		  if (max < v[i])
		  {
			  k = i;
			  max = v[i];
		  }
		}
		
		return k;
	}
	
	
	
	
	
	
	
	
	
	
	//Unterprogramm zum Einlesen
	public static String[] Einlesen()
	{
	int n = 0;	                                                   // Anzahl der gelesenen Sätze
	String[] zeile;	                                               // Referenzvariable
	zeile = new String[50];	                                       // Array von 50 Strings
		
	try 
	   {	
	    FileReader fr = new FileReader("ARTIKEL.TXT");
	    BufferedReader input =	new BufferedReader(fr);
	    zeile[n] = input.readLine();	   
	
	    while ( zeile[n] != null )	                               // Ist zeile[n] noch eine "richtige" Textzeile?
	      {	
		   n = n+1;
	       zeile[n] = input.readLine();
	      }	                                                       // while-Ende
	    input.close();
	    }	                                                       // try-Ende
	
	catch (IOException lesefehler)
	   {	
		System.out.println("Lesefehler " + lesefehler);
	   }
	return zeile;
	}
	
}
```


----------



## XHelp (21. Jan 2012)

1. Poste Java-Code auch in Java-Tags, dann sieht man auch die Zeilennummer
2. Mach mal die Schleife statt 
	
	
	
	





```
i<=m
```
 nur bis 
	
	
	
	





```
i<m
```


----------



## xehpuk (21. Jan 2012)

Tueren[m] ist null.


----------



## Junk4rvin (21. Jan 2012)

Ich weiß nicht, ob ich das so richtig gesehen habe..
Aber du definierst 


```
int t = 0
```

Und willst dann in der for-Schleife für *20 Zeilen* jeweils einen Eintrag für t (=0) schreiben.

Wenn du dann das Ganze sortieren willst,
fragst du ab: 


```
int m = t;
for (int i=0; i<=m; i++){}
```

Dabei ist t immernoch = 0; sprich er läuft nicht mal ein einziges Mal durch.

mfg


----------



## XHelp (21. Jan 2012)

t ist nicht _(zwingend)_ 0, das wird in der oberen Schleife in einem if-Zweig inkrementiert


----------



## Junk4rvin (21. Jan 2012)

Aber das wird bei Java so übermittelt.
Wenn das in einer if-Schleife erhöht wird, nimmt er glaube ich trotzdem den Wert wie er oben definiert wurde, weil er in eine if-Schleife eventuell gar nicht kommt.

Hatte das auch schon ein Mal, auch wenn ich erst seit ca. einem Monat mit Java programmiere.


----------



## XHelp (21. Jan 2012)

Öhm, nö?

Du meinst vermutlich folgendes:

```
Scanner sc;
if (Math.random()>0.5) {
 sc = new Scanner(System.in);
}
System.out.println(sc.nextLine()); //Fehler
```
Das ist aber etwas völlig anderes


----------



## Steeeve (21. Jan 2012)

Hallo zusammen,

danke schon mal für die zwischenzeitlichen Antworten.

Ihr hattet recht, in der for-Schleife muss i<m statt i<=m.

Nun hab ich aber eine neue Fehlermeldung 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
at pruefungneu_package.PRUEFUNGNEUCLASS.MaSu(PRUEFUNGNEUCLASS.java:127)
at pruefungneu_package.PRUEFUNGNEUCLASS.main(PRUEFUNGNEUCLASS.java:69)

das betrifft folgende Teile:

im main-Teil (Zeile: "int k = MaSu(m,uebergabe);")

```
//Start Sortierung Tueren
		int m = t;
		double [] uebergabe = new double[m];
		
		for (int i=0; i<m; i++)
		  {
			uebergabe[i] = Tueren[i].maxwert;
		  }
		
		while (m>0)
		  {
			int k = MaSu(m,uebergabe);
			Tueren[m+1].maxwert = Tueren[k].maxwert;
			Tueren[k].maxwert = Tueren[m].maxwert;
			Tueren[m].maxwert = Tueren[m+1].maxwert;
			m=m-1;
		  }
```

im Unterprogramm Maximumsuche (Zeile: "if (max < v_)")__


		Java:In die Zwischenablage kopieren


//Unterprogramm Maximumsuche
	public static int MaSu(int n, double [] v)
	{
		int k=0;
		double max = v[0];
		
		for (int i=1; i<=n; i++)
		{
		  if (max < v[i])
		  {
			  k = i;
			  max = v[i];
		  }
		}
		
		return k;
	}


Zur Info noch welche Werte sich hiter den Variablen verbergen:
t = 8 ist (also 9 artikel) und r = 10 (Also 11 Artikel).

Das aufteilen in die zwei Listen "Tueren" und "Rest" über die if-Schleife funktioniert also.
Ich hab mir die Artikelnummer (anr) und auch mal die Maximalwerte (maxwert) für die Liste Tueren ausgeben lassen.

Infolgedessen ist in dem Teil, wo "maxwert" sortiert werden soll:

m = 8 (weil t = 8), somit wird uerbergabe 9 Werte zugewiesen. 

Auch diese habe ich mir mal ausgeben lassen:


		Code:In die Zwischenablage kopieren


Maxwert : 460000.0
Maxwert : 576200.0
Maxwert : 1021385.0
Maxwert : 975450.0
Maxwert : 975450.0
Maxwert : 1289570.0
Maxwert : 1315628.0
Maxwert : 892416.0
Maxwert : 882240.0


Jetzt hängst an der Maximumsuche / Sortierung wahrscheinlich.

Eine allgemeine Frage noch, gibts irgendwo ein Glossar, wo ich mal nachschauen kann, was die einzelnen Fehler bedeuten?

Gruß
Steeeve_


----------



## jgh (21. Jan 2012)

ohne viel, geschweige denn alles von deinem Programm gelesen zu haben...würde ich behaupten, dass du die for-Schleife nur solange laufen lassen darfst, wie i echtKleiner der Länge des Arrays...:


```
public static int MaSu(int n, double[] v) {
		int k = 0;
		double max = v[0];

		for (int i = 1; i < v.length; i++) {
```

[edit]das ist kein Unterprogramm, sondern eine Methode... 

und ein Glossar kenne ich jetzt nicht, aber die API zu Exceptions
[/edit]


----------

