java.lang.NullPointerException

bladich

Mitglied
Guten Tag zusammen


Ich habe dieses Programm hier geschrieben:

Code:
//******************************************************//
// usage: java UDPClient port
//******************************************************//

import java.net.*;
import java.io.*;
	 
 class UDPClient {
		public static void main (String args []) {

			networkStuff connection1 = new networkStuff();
			connection1.setOptionsAndSendPacket(666, "127.0.0.1");
			connection1.receivePacket(666);
		}
 }
 
 
 class networkStuff{
	 
	 private byte [] buffer = new byte[1024];
	 private InetAddress server;
	 private DatagramSocket socket;
	 private DatagramPacket packet;
	 
	 
	 void setOptionsAndSendPacket(int port, String host){
			try{
				// Create a Datagram Socket
				DatagramSocket socket = new DatagramSocket();
			
				// Create a packet with server information
				String myMessage = "Sende Request!";
				buffer = myMessage.getBytes("US-ASCII");
				
				// Set host and port
				server = InetAddress.getByName(host);
				DatagramPacket packet = new DatagramPacket(buffer, buffer.length, server, port);
					
				// Send the packet and reset the buffer
				socket.send(packet);
				buffer = new byte[1024];
			}
			
			catch(UnknownHostException e){ System.out.println(e); }
			catch(IOException e){ System.out.println(e); }
	 }
	 
	 void receivePacket(int port){
			
		 	// receive request from client and get client info
			try {
				
				socket.setSoTimeout(100);
				socket.receive(packet);
				
				// output the data from the server
				System.out.println(new String(buffer).trim());
			} 
			catch (IOException e) {System.out.println(e);}
	 }
 }


Es handelt sich um einen Client der eine Anfrage an einen UDP-Server schickt und dann eine Antwort erhalten soll. Das Paket kommt auch beim Server an aber dann sobald der Client die Antwort erhalten soll kommt dieser Fehler:

Code:
java.lang.NullPointerException
	at networkStuff.receivePacket(UDPClient.java:53)
	at UDPClient.main(UDPClient.java:13)
Exception in thread "main"

Was der Fehler aussagt ist mir klar, aber ich weiss nicht wie ich das Problem lösen kann. :suspekt:


Für Tipps und Hinweise im Vorraus vielen Dank =)
 
Hallo!

schreib dich mal

socket = new DatagramSocket();
anstatt:
DatagramSocket socket = new DatagramSocket();

in deiner setOptionsAndSendPacket Methode...
btw. Klassennamen werden in Java groß geschrieben...

Gruß Tom
 
Hi


Danke für die schnelle Antwort! Leider bleibt der Fehler bestehen.:suspekt:

Mein Fehler mit dem kleinen Klassenamen, wurde sofort behoben!
 
Hi,

ich habe die Erfahrung gemacht, dass diese verdammten NullPointerExceptions dann auftreten, wenn man eine Instanzierung vergessen hat. Das könnte bei dir auch das Problem sein.

Bau mal das Rot markierte ein ;-)


Code:
	 void receivePacket(int port){

                                               socket = new Datagramsocket()
			
		 	// receive request from client and get client info
			try {
				
				socket.setSoTimeout(100);
				socket.receive(packet);
				
				// output the data from the server
				System.out.println(new String(buffer).trim());
			} 
			catch (IOException e) {System.out.println(e);}
	 }
 
Guten Tag zusammen.


Konnte das Problem finden, es lag am packet.


Code:
packet = new DatagramPacket(buffer, buffer.length, server, port);

Konnte helfen, aber nun hab ich ein neues Problen und zwar ist jetzt der Buffer irgendwie total verhuntzt. Statt dein 1024 Bytes welche ich senden will, bzw. empfangen, sendet/empfängt er nur noch 14 Bytes.;-]


Warum das bitte? Oo
 
Im Schlaf kam mir die Idee. :p

Code:
//******************************************************//
// usage: java UDPClient port
//******************************************************//

import java.net.*;
import java.io.*;
	 
 class UDPClient {
		public static void main (String args []) {

			NetworkStuff connection1 = new NetworkStuff();
			connection1.setOptionsAndSendPacket(666, "127.0.0.1");
			connection1.receivePacket(666);
		}
 }
 
 
 class NetworkStuff{
	 
	 byte [] buffer;
	 private InetAddress server;
	 private DatagramSocket socket;
	 private DatagramPacket packet;
	 
	 
	 void setOptionsAndSendPacket(int port, String host){
		    buffer = new byte[1024];
			try{
				// Create a Datagram Socket
				socket = new DatagramSocket();
			
				// Create a packet with server information
				String myMessage = "Sende Request!";
				buffer = myMessage.getBytes("US-ASCII");
				
				// Set host and port
				server = InetAddress.getByName(host);
				packet = new DatagramPacket(buffer, buffer.length, server, port);
					
				// Send the packet and reset the buffer
				socket.send(packet);
				buffer = new byte[1024];
			}
			
			catch(UnknownHostException e){ System.out.println(e); }
			catch(IOException e){ System.out.println(e); }
	 }
	 
	 void receivePacket(int port){
		 
		 	// receive request from client and get client info
			try {
				packet = new DatagramPacket(buffer, buffer.length);
				System.out.println("Socket : " + socket);
				System.out.println("Packet : " + packet);
				socket.setSoTimeout(1000000);
				socket.receive(packet);
				
				// output the data from the server
				System.out.println(new String(buffer).trim());
			} 
			catch (IOException e) {System.out.println(e);}
	 }
 }

Und es geht wunderbar. =)


Nun noch eine letzte Frage und zwar hab ich bisschen Mühe in Java nen Objekt zu löschen (ja ich weiss das wird ja an sich automatisch gemacht aber mir fehlt sonst die Idee wie ich es machen soll.)


Situation: Ich habe einen Server der auf ein Signal vom Client wartet, der Server befindet sich in einer do while schleife.

Problem: Der Server antwortet nur einmal und bricht beim starten der Schleife mit diesem Fehler ab:

Exception in thread "main" java.lang.NullPointerException
at NetworkStuff.sendAnswerToClient(UDPServer.java:58)
at UDPServer.main(UDPServer.java:13)
java.net.BindException: Address already in use: Cannot bind

Nun möchte ich am Ende der Schleife das ganze Zeugs freigeben im Speicher, aber irgendwie keine Ahnung wie ich das in Java realisieren sollte. Google konnte mir nicht wirklich weiter helfen wie ich das Objekt lösche.


Hier noch der Code:

Code:
//******************************************************//
// usage: java UDPServer port-number
//******************************************************//
 import java.net.*;
 import java.io.*;

 class UDPServer{
   
 		public static void main(String[] args){
 			do{
	 			NetworkStuff connection1 = new NetworkStuff();
	 			connection1.setOptionsAndWaitForPacket(666);
	 			connection1.sendAnswerToClient();
	 			
 			}while(1==1);
 		}
 		
 }
 
 
 class NetworkStuff{
	 
		private byte [] buffer = new byte[1024];
		private int client_port;
		private InetAddress client;
		private DatagramSocket socket;
		private DatagramPacket packet;
		String myMessage;
		 
 		void setOptionsAndWaitForPacket(int port){		
 		
		 		try{
		 			// Create a Datagram Socket (args[0] is the port)
		 			socket = new DatagramSocket(port);
					
					// Create an empty Datagram Packet 
					packet = new DatagramPacket(buffer, buffer.length );
					
					// receive request from client and get client info
					socket.receive(packet);
					client = packet.getAddress();
					client_port = packet.getPort();
					System.out.println(new String(buffer).trim());
		 		} 		
		 		catch(UnknownHostException e){ System.out.println(e); }
		 		catch(IOException e){ System.out.println(e); }
 		}
 		
 		void sendAnswerToClient(){
 			
	 		try{
				// send some data to the client
	 			packet = new DatagramPacket(buffer, buffer.length);
				myMessage = "Angekommen, sende Antwort!";
				buffer = myMessage.getBytes("US-ASCII");
				packet = new DatagramPacket(buffer, buffer.length, client, client_port);
				socket.send(packet);
				buffer = new byte[1024];
	 		} 		
	 		catch(UnknownHostException e){ System.out.println(e); }
	 		catch(IOException e){ System.out.println(e); }
 		}

 }


Vielen Dank im Vorraus für Tipps/Lösungen :) und nochmals Danke an die Helfer.


Edit: socket.close(); brachte die Lösung. :) Danke euch allen!
 
Zuletzt bearbeitet:
Direkten zugriff hast du darauf nicht.

Normalerweise benötigt man für sowas ein dispose() aber in Java reicht es, wenn du die Objekte = null setzt, dann wird es automatisch vom Garbage Collector erfasst und weggeputzt.

Gruß
Chris
 
Zurück