线程" main"中的例外情况如何解决java.lang.ArrayIndexOutOfBoundsException:0

时间:2013-11-05 19:57:49

标签: java sockets

1.我是java的新手,所以我是一个菜鸟,但我试图让这个聊天服务器和客户端 到目前为止服务器将运行但客户端不会返回标题中的错误,请帮助并尝试保持noob友好:)

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 个答案:

答案 0 :(得分:0)

我怀疑你是用它开始的:

java chatClient

您需要指定登录名和您要与之聊天的人,例如

java chatClient fred george

否则args将是一个空数组,因此评估args[0]中的args[1]main将会失败。

我也强烈建议您修复缩进和命名 - 遵循标准Java naming conventions

答案 1 :(得分:0)

您的计划中唯一的数组似乎是args中的main。如果您没有输入任何命令行参数,那么该数组的长度为0,并且没有要访问的元素。

您需要两个参数,因此在访问之前请检查数组的长度。

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

答案 2 :(得分:0)

实例化chatClient对象时,您要指定args数组中的两个元素:

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

此数组从命令行参数填充。您必须在调用程序时指定它们,否则数组将为空:

java chatClient arg1 arg2

您可以阅读有关指定命令行参数here的更多信息。

作为旁注,请考虑重命名您的课程,使其遵循naming conventions

  

类名应该是名词,混合大小写的第一个字母   每个内部词都大写。尽量保持你的班级名称简单   和描述性的。使用整个单词 - 避免使用缩写词和缩写词   (除非缩写比长形式更广泛使用,   例如URL或HTML)。