Click here to Skip to main content
15,889,867 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have this error
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

for this code
Java
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.BitSet;
import java.util.concurrent.TimeUnit;
import java.util.Random;


public class main {

	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception{        
		String servername = args[0];
		int serverport = 9987;
		try{
        serverport= Integer.parseInt(args[1]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[1] + " must be an integer.");
	        System.exit(1);
		}
		int maxusers = 512;
		try{
		maxusers= Integer.parseInt(args[2]);
	}
	catch(NumberFormatException e){
		System.err.println("Argument" + args[2] + " must be an integer.");
        System.exit(1);
	}
		int clientsstart = 200;
		try{
		clientsstart= Integer.parseInt(args[3]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[3] + " must be an integer.");
	        System.exit(1);
		}
		int clientsend = 512;
		try{
		clientsend= Integer.parseInt(args[4]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[4] + " must be an integer.");
	        System.exit(1);
		}
        /*BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Enter The Server Name: ");
		servername = inFromUser.readLine();
		System.out.println("Enter A server port (Example:9987): ");
		serverport = inFromUser.readLine();
		System.out.println("Enter A Slot Number (Example:512): ");
		maxusers = inFromUser.readLine();
		System.out.println("Enter A client count (Example:964): ");
		clients = inFromUser.readLine();*/
		Random random = new Random();
while(true){
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IPAddress = InetAddress.getByName("194.97.114.3");
        byte[] request = new byte[5000];
        byte[] response = new byte[257];
        byte[] response2 = new byte[257];
        byte[] rawBytes;
        int nIndex=0;
		DatagramPacket sendpacket = new DatagramPacket(request,nIndex,IPAddress,2010);
		DatagramPacket receivePacket = new DatagramPacket(response, response.length);
        DatagramPacket sendpacket2 = new DatagramPacket(request,nIndex,IPAddress,2010);
        DatagramPacket receivePacket2 = new DatagramPacket(response, response.length);
        here:
        nIndex = 0;
        request[nIndex++] = 0x01;
        request[nIndex++] = 0x03;
        request[nIndex++] = 0x00;
        request[nIndex++] = 0x01;       
        sendpacket.setData(request, 0, nIndex);
        clientSocket.send(sendpacket);        
        clientSocket.receive(receivePacket);
        nIndex = 0;
        request[nIndex++] = 0x01;
        request[nIndex++] = 0x04;
        request[nIndex++] = 0x00;
        request[nIndex++] = 0x02;
        request[nIndex++] = response[4];
        request[nIndex++] = response[5];
        request[nIndex++] = response[6];
        request[nIndex++] = response[7];
        byte[] portBytes = GetBytes(serverport);
        for (int i = 0; i <= 1; i++)
            request[nIndex++] = portBytes[i];
        byte[] slotsBytes = GetBytes(maxusers);
        for (int i = 0; i <= 1; i++)
            request[nIndex++] = slotsBytes[i];
        byte[] clientnumBytes = GetBytes(showRandomInteger(clientsstart ,clientsend, random));
        for (int i = 0; i <= 1; i++)
            request[nIndex++] = clientnumBytes[i];
        BitSet bits = new BitSet();
        bits.set(1,true);
        byte[] bitss = bits.toByteArray();
        request[nIndex++] = bitss[0];
        request[nIndex++] = (byte) servername.length();
        rawBytes = servername.getBytes();
        System.arraycopy(rawBytes, 0, request, nIndex, rawBytes.length);
        nIndex += rawBytes.length;
        sendpacket2.setData(request, 0, nIndex);
        clientSocket.send(sendpacket2);
        clientSocket.receive(receivePacket2);
        TimeUnit.MINUTES.sleep(5);
        }
	}
	 
	public static byte[] GetBytes(int value)
	{
	    ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
	    buffer.putInt(value);
	    return buffer.array();
	}
	private static int showRandomInteger(int aStart, int aEnd, Random aRandom){
	    if (aStart > aEnd) {
	      throw new IllegalArgumentException("Start cannot exceed End.");
	    }
	    //get the range, casting to long to avoid overflow problems
	    long range = (long)aEnd - (long)aStart + 1;
	    // compute a fraction of the range, 0 <= frac < range
	    long fraction = (long)(range * aRandom.nextDouble());
	    int randomNumber =  (int)(fraction + aStart);    
	    return randomNumber;
	  }

}
how to fix it ?

Here is all the code with source and everything GitHub - HerrSammyDE/TS3-ServerListEmulator: TeamSpeak 3 Server List Emulator in Java[^]

What I have tried:

I have tried to change the compiller version off java but i am not an expert in java , i am a noob
Posted
Updated 27-Jun-20 4:01am
v3

An ArrayIndexOutOfBoundsException means that you are trying to access an element within an array outside of its bounds, an example would be trying to get the 8th element when there are only 5.

One helpful thing to do would be to check out how many elements are actually in the array
int ElementCount = args.length
and make sure you are not calling for an index equal to or greater than that value (0 indexing).

The really helpful thing though is to actually debug the code, going through it line by line; so you can see exactly where the problem occurred.
 
Share this answer
 
Quote:
I have this error

Giving exact error message including line number is the minimum information, otherwise it is a guessing game because we can't run your code without parameters and context.
Quote:
ArrayIndexOutOfBoundsException

This error message means that somewhere an array is smaller than your code is expecting.

Advice: Learn to indent properly your code, it show its structure and it helps reading and understanding. It also helps spotting structures mistakes.
Java
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.BitSet;
import java.util.concurrent.TimeUnit;
import java.util.Random;


public class main {

	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception{
		String servername = args[0];
		int serverport = 9987;
		try{
			serverport= Integer.parseInt(args[1]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[1] + " must be an integer.");
			System.exit(1);
		}
		int maxusers = 512;
		try{
			maxusers= Integer.parseInt(args[2]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[2] + " must be an integer.");
			System.exit(1);
		}
		int clientsstart = 200;
		try{
			clientsstart= Integer.parseInt(args[3]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[3] + " must be an integer.");
			System.exit(1);
		}
		int clientsend = 512;
		try{
			clientsend= Integer.parseInt(args[4]);
		}
		catch(NumberFormatException e){
			System.err.println("Argument" + args[4] + " must be an integer.");
			System.exit(1);
		}
		/*BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Enter The Server Name: ");
		servername = inFromUser.readLine();
		System.out.println("Enter A server port (Example:9987): ");
		serverport = inFromUser.readLine();
		System.out.println("Enter A Slot Number (Example:512): ");
		maxusers = inFromUser.readLine();
		System.out.println("Enter A client count (Example:964): ");
		clients = inFromUser.readLine();*/
		Random random = new Random();
		while(true){
			DatagramSocket clientSocket = new DatagramSocket();
			InetAddress IPAddress = InetAddress.getByName("194.97.114.3");
			byte[] request = new byte[5000];
			byte[] response = new byte[257];
			byte[] response2 = new byte[257];
			byte[] rawBytes;
			int nIndex=0;
			DatagramPacket sendpacket = new DatagramPacket(request,nIndex,IPAddress,2010);
			DatagramPacket receivePacket = new DatagramPacket(response, response.length);
			DatagramPacket sendpacket2 = new DatagramPacket(request,nIndex,IPAddress,2010);
			DatagramPacket receivePacket2 = new DatagramPacket(response, response.length);
			here:
			nIndex = 0;
			request[nIndex++] = 0x01;
			request[nIndex++] = 0x03;
			request[nIndex++] = 0x00;
			request[nIndex++] = 0x01;
			sendpacket.setData(request, 0, nIndex);
			clientSocket.send(sendpacket);
			clientSocket.receive(receivePacket);
			nIndex = 0;
			request[nIndex++] = 0x01;
			request[nIndex++] = 0x04;
			request[nIndex++] = 0x00;
			request[nIndex++] = 0x02;
			request[nIndex++] = response[4];
			request[nIndex++] = response[5];
			request[nIndex++] = response[6];
			request[nIndex++] = response[7];
			byte[] portBytes = GetBytes(serverport);
			for (int i = 0; i <= 1; i++)
				request[nIndex++] = portBytes[i];
			byte[] slotsBytes = GetBytes(maxusers);
			for (int i = 0; i <= 1; i++)
				request[nIndex++] = slotsBytes[i];
			byte[] clientnumBytes = GetBytes(showRandomInteger(clientsstart ,clientsend, random));
			for (int i = 0; i <= 1; i++)
				request[nIndex++] = clientnumBytes[i];
			BitSet bits = new BitSet();
			bits.set(1,true);
			byte[] bitss = bits.toByteArray();
			request[nIndex++] = bitss[0];
			request[nIndex++] = (byte) servername.length();
			rawBytes = servername.getBytes();
			System.arraycopy(rawBytes, 0, request, nIndex, rawBytes.length);
			nIndex += rawBytes.length;
			sendpacket2.setData(request, 0, nIndex);
			clientSocket.send(sendpacket2);
			clientSocket.receive(receivePacket2);
			TimeUnit.MINUTES.sleep(5);
		}
	}

	public static byte[] GetBytes(int value)
	{
		ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
		buffer.putInt(value);
		return buffer.array();
	}
	private static int showRandomInteger(int aStart, int aEnd, Random aRandom){
		if (aStart > aEnd) {
			throw new IllegalArgumentException("Start cannot exceed End.");
		}
		//get the range, casting to long to avoid overflow problems
		long range = (long)aEnd - (long)aStart + 1;
		// compute a fraction of the range, 0 <= frac < range
		long fraction = (long)(range * aRandom.nextDouble());
		int randomNumber =  (int)(fraction + aStart);
		return randomNumber;
	}

}

Indentation style - Wikipedia[^]

Professional programmer's editors have this feature and others ones such as parenthesis matching and syntax highlighting.
Notepad++ Home[^]
ultraedit[^]
 
Share this answer
 
Somewhere in your code you are trying to access an element of an array with an index value that is either negative or beyond the range of the array. Note that arrays are indexed from 0 to the length - 1. So the following code would generate such an error:
Java
int[] numbers = new int[3];
numbers[3] = 1; // error indices must be in the range 0:2

Since you did not provide the full message that tells which line the error occurred on it is not possible to suggest a solution.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900