java.lang.NullPointerException bei Threadprogrammierung

Status
Nicht offen für weitere Antworten.

jobu0101

Bekanntes Mitglied
Java:
while (t1.bytes.size() > 0 && t2.bytes.size() > 0) {
    iden=true;
    for(int i=0;i<t1.bytes.get(0).length;i++){
        if(t1.bytes.get(0)[i]!=t2.bytes.get(0)[i])
            iden=false;
    }
    if (iden) {
        counter -= t1.bytes.get(0).length;
        t1.lock.lock();
        t1.bytes.remove(0);
        t1.lock.unlock();
        t2.lock.lock();
        t2.bytes.remove(0);
        t2.lock.unlock();
    } else {
        t1.interrupt();
        t2.interrupt();
        System.out.println("Dateien unterscheiden sich beim "
                + (size - counter + 1) + ". Array");
        return false;
    }
}

Das ist ein Teil des Programms. Der Teil der mir Probleme bereitet. Manchmal geht alles gut, manchmal tritt in der Zeile: "if(t1.bytes.get(0)!=t2.bytes.get(0))" eine Exception in thread "Thread-0" java.lang.NullPointerException auf. Ich kann aber nicht verstehen wieso. Zwar fügen die Threads t1 und t2 den ArrayListen t1.bytes und t2.bytes über add Elemente zu, doch löscht alleine diese Schleife hier Elemente raus. Beim Löschen (kann man ja hier sehen), aber auch beim Adden wird gelockt. Bei den Leseoperationen nicht. Die While-Schleife fragt ganz oben ab, ob die beiden Listen noch Elemente haben. Wie kann es dann manchmal später beim Zugriff zu einer NullPointerException kommen?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Wenn dort eine NullPointerException auftritt, gibt es mehrere Möglichkeiten:
t1 ist null
t2 ist null
t1.bytes ist null
t2.bytes ist null
t1.bytes.get(0) ist null
t2.bytes.get(0) ist null
(theoretisch glaubich noch zwei mehr, wenn da das Auto-Unboxing zuschlägt)

Insbesondere die letzten beiden sind durch die while-Bedingung obendrüber ja nicht ausgeschlossen. Aber selbst wenn, dann könnte ein anderer Thread zwischen dem Überprüfen des while-Bedinung und dem "if" irgendwelchen Mist mit t1 und t2 machen...
 

jobu0101

Bekanntes Mitglied
Wenn dort eine NullPointerException auftritt, gibt es mehrere Möglichkeiten:
t1 ist null
t2 ist null
t1.bytes ist null
t2.bytes ist null
t1.bytes.get(0) ist null
t2.bytes.get(0) ist null
(theoretisch glaubich noch zwei mehr, wenn da das Auto-Unboxing zuschlägt)

Insbesondere die letzten beiden sind durch die while-Bedingung obendrüber ja nicht ausgeschlossen. Aber selbst wenn, dann könnte ein anderer Thread zwischen dem Überprüfen des while-Bedinung und dem "if" irgendwelchen Mist mit t1 und t2 machen...

Das Einzige, was dazwischen passieren kann, ist das Hinzufügen eines neuen Elements...
 

Marco13

Top Contributor
Aber es ist nicht sichergestellt, dass nicht während des Hinzufügens ein anderer Thread Daten liest? Poste mal den Stack trace.
 

jobu0101

Bekanntes Mitglied
Exception in thread "Thread-0" java.lang.NullPointerException
at compare.Compare.compare(Compare.java:41)
at compare.Compare.run(Compare.java:69)
 

jobu0101

Bekanntes Mitglied
Hier zur Analyse mal das komplette Programm:

Das Programm dient dem Vergleichen zweiter Dateien:

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReadFile extends Thread {

	File f;
	InputStream in;
	public ArrayList<byte[]> bytes;
	public Long size;
	int step = 100000;
	int maxSize = 100;
	final Lock lock;

	ReadFile(File file) {
		f = file;
		if (!f.exists())
			throw new IllegalArgumentException("File does not exist!");
		bytes = new ArrayList<byte[]>();
		lock = new ReentrantLock();
	}

	void read() {
		size = f.length();
		byte[] buffer;
		try {
			in = new FileInputStream(f);
		} catch (FileNotFoundException e) {
			System.err.println("File does not exist!");
		}
		for (long i = size; i > 0 && !isInterrupted(); i -= step) {
			while (bytes.size() > maxSize) {
				try {
					sleep(1);
				} catch (InterruptedException e) {
					System.err.println("Interrupted!");
				}
			}
			buffer = new byte[(int) Math.min(i, step)];
			try {
				in.read(buffer);
			} catch (IOException e) {
				System.err.println("Fehler beim Lesen!");
			}
			lock.lock();
			bytes.add(buffer);
			lock.unlock();
		}
		try {
			in.close();
		} catch (IOException e) {
			System.err.println("Fehler beim Schließen!");
		}
	}

	public void run() {
		read();
	}

}

Java:
import java.io.File;

public class Compare extends Thread {

	ReadFile t1, t2;
	long size, counter;

	Compare(File f1, File f2) {
		t1 = new ReadFile(f1);
		t2 = new ReadFile(f2);
	}

	boolean compare() {
		t1.start();
		t2.start();
		while (t1.size == null || t2.size == null) {
			try {
				sleep(1);
			} catch (InterruptedException e) {
				System.err.println("Interrupted!");
			}
		}
		if (t1.size.longValue() != t2.size.longValue()) {
			t1.interrupt();
			t2.interrupt();
			System.out.println("Dateien haben nicht die selbe Größe");
		} else {
			counter = size = t1.size.longValue();
			boolean iden;
			while (counter > 0) {
//				System.out.println(100d-100d*counter/size);
				try {
					sleep(1);
				} catch (InterruptedException e) {
					System.err.println("Interrupted!");
				}
				while (t1.bytes.size() > 0 && t2.bytes.size() > 0) {
					iden=true;
					for(int i=0;i<t1.bytes.get(0).length;i++){
						if(t1.bytes.get(0)[i]!=t2.bytes.get(0)[i])
							iden=false;
					}
					if (iden) {
						counter -= t1.bytes.get(0).length;
						t1.lock.lock();
						t1.bytes.remove(0);
						t1.lock.unlock();
						t2.lock.lock();
						t2.bytes.remove(0);
						t2.lock.unlock();
//						System.out.println("Größe: "+t1.bytes.size()+" - "+t2.bytes.size());
					} else {
						t1.interrupt();
						t2.interrupt();
						System.out.println("Dateien unterscheiden sich beim "
								+ (size - counter + 1) + ". Array");
						return false;
					}
				}
			}
			return true;
		}
		return false;
	}

	public void run() {
		if (compare())
			System.out.println("Identisch");
		else
			System.out.println("Ungleich");
		System.out.println(System.currentTimeMillis());
	}

	public static void main(String[] args) {
		System.out.println(System.currentTimeMillis());
		File f1 = new File("")//Hier Pfad zu Datei 2 eintragen
		File f2 = new File("")//Hier Pfad zu Datei 2 eintragen
		Compare c = new Compare(f1, f2);
		c.start();
	}

}
 
S

SlaterB

Gast
> Exception in thread "Thread-0" java.lang.NullPointerException
> at compare.Compare.compare(Compare.java:41)


Zeile 41 nach Forum-Zählung ist
> iden=false;
ist das wirklich auch Zeile 41 in deiner Datei?
die package-Angabe fehlt auch,
bei sowas bitte extrem genau sein,

-------

wenn du die fragliche Zeile und das fragliche Objekt nicht erkennen kannst,
dann schreibe
try {

}catch(NullPointerException e) {

}

um den größeren problematischen Bereich und gib im Falle einer Exception wirklich jede Variable aus:
t1 ist: .. t1
t2 ist: ..
t1.bytes ist: ..

usw.

-------

bei mir läuft es,
vielleicht könntest du auch deine Testdateien hochladen (Anhang an Posting)
 
Zuletzt bearbeitet von einem Moderator:

jobu0101

Bekanntes Mitglied
Habe Dateien von einem GB benutzt. Aber der Fehler kam ja nicht immer an einer ganz bestimmten Stelle sondern auch bei manchen Durchläufen gar nicht. Also die Dateien produzieren den Fehler nicht.

Zeile 41 bei mir war: for(int i=0;i<t1.bytes.get(0).length;i++){
 
S

SlaterB

Gast
Dateien, bei denen der Fehler manchmal auftritt wären immer noch besser als meine Dateien, bei denen der Fehler (nach 10 Versuchen) nie auftritt ;)

aber ich habe dir umfassend erklärt, wie du den Fehler selber finden kannst:
das null-Objekt identifizieren
und dann noch prüfen, wann und wo es gesetzt wird,

selber kann ich leider keinen Fehler erkennen
 
S

SlaterB

Gast
Beispiel nach PM-Anfrage:
Java:
public class Test
{
    public static void main(String[] args)
    {
        Object o = null;
        Object o2 = null;
        for (int i = 0; i < 1000; i++)
        {
            try
            {
                o = (Math.random() < 0.004 ? null : "Test");
                o2 = (Math.random() < 0.004 ? null : "Test2");
                o.toString();
                o2.toString();

            }
            catch (NullPointerException e)
            {
                System.out.println("NPE in Durchgang " + i + ",   o ist hier: " + o + ", o2: " + o2);
            }
        }
    }
}
mögliche Ausgabe:
Code:
NPE in Durchgang 30,   o ist hier: null, o2: Test2
NPE in Durchgang 144,   o ist hier: Test, o2: null
NPE in Durchgang 419,   o ist hier: null, o2: Test2
NPE in Durchgang 439,   o ist hier: null, o2: Test2
NPE in Durchgang 489,   o ist hier: Test, o2: null
NPE in Durchgang 566,   o ist hier: Test, o2: null
NPE in Durchgang 856,   o ist hier: Test, o2: null
NPE in Durchgang 974,   o ist hier: Test, o2: null
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
H java.lang.NullPointerException Allgemeine Java-Themen 5
L Interpreter-Fehler java.lang.NullPointerException Allgemeine Java-Themen 17
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S javadoc java.lang.NullPointerException Allgemeine Java-Themen 2
MonsterBit java.lang.NullPointerException Allgemeine Java-Themen 2
J Fehler: java.lang.NullPointerException Allgemeine Java-Themen 2
J Folgender Fehler: java.lang.NullPointerException Allgemeine Java-Themen 4
G java.lang.NullPointerException JFreeChart Allgemeine Java-Themen 5
M java.lang.NullPointerException im Chatclient Allgemeine Java-Themen 12
B java.lang.NullPointerException Allgemeine Java-Themen 11
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
T Eclipse Dll einbinden java.lang.UnsatisfiedLinkError nur in Eclipse nicht via javac Allgemeine Java-Themen 1
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
Crooda Compiler-Fehler java.lang.NoClassDefFoundError bitcoinj Allgemeine Java-Themen 1
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
F java.lang.ClassNotFoundException: .class Allgemeine Java-Themen 5
S java.lang.NoClassDefFoundError Allgemeine Java-Themen 5
J Compiler-Fehler java.lang.StringIndexOutOfBoundsException Allgemeine Java-Themen 12
D java.lang.TypeNotPresentException Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
B Variable class in java.lang.Object Allgemeine Java-Themen 11
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
T ProcessBuilder (java.lang.NoClassDefFoundError) Allgemeine Java-Themen 2
T java.lang.AssertionError: Allgemeine Java-Themen 4
T java.lang.ClassCastException: Allgemeine Java-Themen 4
P Java Probleme - java.lang.Thread.run(Unkown Source) Allgemeine Java-Themen 10
B java.lang.UnsupportedClassVersionError Allgemeine Java-Themen 12
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
B JNI - java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 21
E Interpreter-Fehler java.lang.ExceptionInInitializerError Allgemeine Java-Themen 12
C java.lang.ClassCastException Allgemeine Java-Themen 3
P Fehler beim Programmstart: java.lang.NoClassDefFound Allgemeine Java-Themen 12
T java.lang.ClassCastException Allgemeine Java-Themen 7
B Java - java.lang Allgemeine Java-Themen 12
sylo java.lang.NoSuchMethodError: Obwohl Methode vorhanden Allgemeine Java-Themen 8
H Applet java.lang.reflect.InvocationTargetException Allgemeine Java-Themen 9
M SerialPort RS232 : java.lang.NoSuchFieldError: eis Allgemeine Java-Themen 2
U java.lang.ClassNotFoundException: .jar Allgemeine Java-Themen 8
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
W java.lang.ClassCastException Allgemeine Java-Themen 10
N Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.library.p Allgemeine Java-Themen 4
N java.lang.InstantiationException Allgemeine Java-Themen 10
D replaceAll => no such java.lang.NoSuchMethodError Allgemeine Java-Themen 5
G java.lang.LinkageError: loader constraints violation. Allgemeine Java-Themen 3
O java.lang.NumberFormatException für normalen integer Allgemeine Java-Themen 4
G Javadoc generiert keine Links zu java.lang Klassen? Allgemeine Java-Themen 4
Y java.lang.UnsupportedClassVersionError: Allgemeine Java-Themen 5
G java.lang.ClassCastException Allgemeine Java-Themen 3
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
I java.lang.UnsatisfiedLinkError: Allgemeine Java-Themen 8
J Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 26
J java.lang.StackOverflowError Debugging? Allgemeine Java-Themen 51
D java.lang.UnsatisfiedLinkError Allgemeine Java-Themen 5
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
S java.lang.UnsatisfiedLinkError mit JNI Allgemeine Java-Themen 6
reibi java.lang.Class - Resource - Solaris Allgemeine Java-Themen 17
S Exception in Thread "main" java.lang.NoClassDef. b Allgemeine Java-Themen 2
M java.lang.UnsupportedClassVersionError: Bad version number i Allgemeine Java-Themen 5
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
O "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBounds Allgemeine Java-Themen 6
B Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 12
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
E Java Fehlermeldung java.lang.NoClassDefFoundError Allgemeine Java-Themen 3
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
H java.lang.ExceptionInInitializerError Allgemeine Java-Themen 7
D java.lang.IllegalMonitorStateException: current thread not Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 15
P Exception in thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 3
T Profifrage: java.lang.StackOverflowError bei BigInteger Allgemeine Java-Themen 27
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
W java.lang.ClassNotFoundException Allgemeine Java-Themen 10
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
B Exception in thread "main" java.lang.OutOfMemoryEr Allgemeine Java-Themen 5
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
S Exception in thread "main" java.lang.StringIndexOu Allgemeine Java-Themen 9
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
J java.lang.ArrayIndexOutOfBoundsException Allgemeine Java-Themen 2
P Hilfe zu java.lang.Object Allgemeine Java-Themen 3
K java.lang.reflect - Getter und Setter ermitteln Allgemeine Java-Themen 8
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
G Java.lang.Compiler Allgemeine Java-Themen 3
E Exception in Thread "main" java.lang.NoClassDefFou Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
R java.lang.String maximale Anzahl der Zeichen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben