Исключение в потоке "main" как решить java.lang.ArrayIndexOutOfBoundsException: 0

1.i новичок в java, поэтому im noob, но я пытаюсь сделать этот чат-сервер и клиент сервером до сих пор будет работать, но клиент привыкнет и вернет ошибку в заголовке, пожалуйста, помогите и попробуйте и сохраните его в noob friendly :)

import java.net.*;
import java.io.*;
import java.awt.*;

@SuppressWarnings("serial")
class chatClient extends Frame implements Runnable
{
Socket soc; 
TextField tf;
TextArea ta;
Button btnSend,btnClose;
String sendTo;
String LoginName;
Thread t=null;
DataOutputStream dout;
DataInputStream din;
chatClient(String LoginName,String chatwith) throws Exception
{
 super(LoginName);
 this.LoginName=LoginName;
 sendTo=chatwith;
 tf=new TextField(50);
 ta=new TextArea(50,50);
 btnSend=new Button("Send");
 btnClose=new Button("Close");
 soc=new Socket("127.0.0.1",5211);

 din=new DataInputStream(soc.getInputStream()); 
 dout=new DataOutputStream(soc.getOutputStream()); 
 dout.writeUTF(LoginName);

 t=new Thread(this);
 t.start();

}
@SuppressWarnings("deprecation")
void setup()
{
 setSize(600,400);
 setLayout(new GridLayout(2,1));

 add(ta);
 Panel p=new Panel();

 p.add(tf);
 p.add(btnSend);
 p.add(btnClose);
 add(p);
 show(); 
}
@SuppressWarnings("deprecation")
public boolean action(Event e,Object o)
{
 if(e.arg.equals("Send"))
 {
 try
 {
 dout.writeUTF(sendTo + " " + "DATA" + " " + tf.getText().toString()); 
 ta.append("\n" + LoginName + " Says:" + tf.getText().toString()); 
 tf.setText("");
 }
 catch(Exception ex)
 {
 } 
 }
 else if(e.arg.equals("Close"))
 {
 try
 {
 dout.writeUTF(LoginName + " LOGOUT");
 System.exit(1);
 }
 catch(Exception ex)
 {
 }

 }

 return super.action(e,o);
}
public static void main(String[] args) throws Exception
{
 chatClient Client=new chatClient(args[0], args[1]);
 Client.setup(); 
} 
public void run()
{ 
 while(true)
 {
 try
 {
 ta.append( "\n" + sendTo + " Says :" + din.readUTF());

 }
 catch(Exception ex)
 {
 ex.printStackTrace();
 }
 }
}
}
3 ответа

При создании экземпляра объекта chatClient вы указываете два элемента из массива args:

chatClient Client=new chatClient(args[0], args[1]);

Этот массив заполняется из аргументов командной строки. Вы должны указывать их при вызове своей программы, иначе массив будет пустым:

java chatClient arg1 arg2

Вы можете прочитать больше о задании аргументов командной строки здесь.

В качестве примечания обратите внимание на переименование вашего класса, чтобы он соответствовал соглашениям об именах:

Имена классов должны быть существительными в смешанном случае с первой буквой каждого внутреннего слова, заглавного. Постарайтесь, чтобы ваши имена классов были простыми и описательными. Используйте целые слова - избегайте сокращений и сокращений (если аббревиатура гораздо более широко используется, чем длинная форма, такая как URL или HTML).


Я подозреваю, что вы начинаете с:

java chatClient

Вам необходимо указать имя входа и с кем вы хотите общаться, например

java chatClient fred george

В противном случае args будет пустым массивом, поэтому оценка args[0] или args[1] в main не удастся.

Я также настоятельно рекомендую вам исправить как отступы, так и ваше именование - следуйте стандартным соглашениям об именах Java.


Единственный массив в вашей программе, по-видимому, является main args. Если вы не вводите аргументы командной строки, массив будет иметь длину 0, и нет элементов для доступа.

Вы ожидаете два аргумента, поэтому проверяйте длину массива перед его доступом.

if (args.length >= 2)
{
 chatClient Client=new chatClient(args[0], args[1]);
 Client.setup(); 
}
else
{
 // Handle error.
}

licensed under cc by-sa 3.0 with attribution.