2012-04-30 51 views
0

我正在使用JMS创建一个简单的聊天应用程序,但是我的代码不工作,我不知道为什么。这是我的代码,我与JBoss使用,所以我开的酒吧和我写这篇文章时,我点击启动Eclipse给我这个错误消息:与JMS的简单聊天

<pre> 
Topic or username missingjava.lang.ArrayIndexOutOfBoundsException: 0 
    at chat.pub.main(pub.java:105) 
</pre> 

and this is the code, what is the problem? 

    package chat; 

    import javax.jms.*; 
    import javax.naming.*; 
    import java.io.*; 
    import java.io.InputStreamReader; 
    import java.util.Properties; 

    public class pub implements javax.jms.MessageListener{ 
     private TopicSession pubSession; 
     private TopicSession subSession; 
     private TopicPublisher publisher; 
     private TopicConnection connection; 
     private String username; 

     /* Constructor. Establish JMS publisher and subscriber */ 
     public pub(String topicName, String username, String password) 
     throws Exception { 
      // Obtain a JNDI connection 
      Properties env = new Properties(); 
      env.put(Context.SECURITY_PRINCIPAL, "guest"); 
      env.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
      env.setProperty("java.naming.provider.url", "localhost:1099"); 
      env.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); 

      // ... specify the JNDI properties specific to the vendor 

      InitialContext jndi = new InitialContext(env); 


      // Look up a JMS connection factory 
      TopicConnectionFactory conFactory = 
      (TopicConnectionFactory)jndi.lookup("TopicConnectionFactory"); 

      // Create a JMS connection 
      TopicConnection connection = 
      conFactory.createTopicConnection(username,password); 





      // Create two JMS session objects 
      TopicSession pubSession = 
      connection.createTopicSession(false, 
              Session.AUTO_ACKNOWLEDGE); 
      TopicSession subSession = 
      connection.createTopicSession(false, 
              Session.AUTO_ACKNOWLEDGE); 

      // Look up a JMS topic 
      Topic chatTopic = (Topic)jndi.lookup(topicName); 

      // Create a JMS publisher and subscriber 
      TopicPublisher publisher1 = 
       pubSession.createPublisher(chatTopic); 
      TopicSubscriber subscriber = 
       subSession.createSubscriber(chatTopic); 

      // Set a JMS message listener 
      subscriber.setMessageListener(this); 

      // Intialize the Chat application 
      set(connection, pubSession, subSession, publisher1, username); 

      // Start the JMS connection; allows messages to be delivered 
      connection.start(); 

     } 
     /* Initialize the instance variables */ 
     public void set(TopicConnection con, TopicSession pubSess, 
         TopicSession subSess, TopicPublisher pub, 
         String username) { 
      this.connection = con; 
      this.pubSession = pubSess; 
      this.subSession = subSess; 
      this.publisher = pub; 
      this.username = username; 
     } 
     /* Receive message from topic subscriber */ 
     public void onMessage(Message message) { 
      try { 
       TextMessage textMessage = (TextMessage) message; 
       String text = textMessage.getText(); 
       System.out.println(text); 
      } catch (JMSException jmse){ jmse.printStackTrace(); } 
     } 
     /* Create and send message using topic publisher */ 
     protected void writeMessage(String text) throws JMSException { 
      TextMessage message = pubSession.createTextMessage(); 
      message.setText(username+" : "+text); 
      publisher.publish(message); 
     } 
     /* Close the JMS connection */ 
     public void close() throws JMSException { 
      connection.close(); 
     } 
     /* Run the Chat client */ 
     public static void main(String [] args){ 
      try{ 
       if (args.length!=3) 
        System.out.println("Topic or username missing"); 

       // args[0]=topicName; args[1]=username; args[2]=password 
       pub chat = new pub(args[0],args[1],args[2]); 

       // Read from command line 
       BufferedReader commandLine = new 
        java.io.BufferedReader(new InputStreamReader(System.in)); 

       // Loop until the word "exit" is typed 
       while(true){ 
        String s = commandLine.readLine(); 
        if (s.equalsIgnoreCase("exit")){ 
         chat.close(); // close down connection 
         System.exit(0);// exit program 
        } else 
         chat.writeMessage(s); 
       } 
      } catch (Exception e){ e.printStackTrace(); } 
     } 
    } 
    i do this ![enter image description here][1] 
    and now i get this eroor 
    ![enter image description here][2] 
    and i dont no what i do not ok i will be happy for help thanks!! 


     [1]: http://i.stack.imgur.com/c04o1.gif 
     [2]: http://i.stack.imgur.com/dxCIU.gif 
+2

欢迎StackOverflow的参数。请阅读[FAQ](http://stackoverflow.com/faq#questions)了解如何提出问题。另外,更改问题标题。 –

+0

不知道它是否在常见问题解答中提到,但我只能阅读.. *“嗨,我想..”* .. ..停止前。请在每个句子的开头添加一个大写字母,以及单词'I'。这使得它更易于阅读。你不想让它难以阅读,**你会吗? –

回答

2
java.lang.ArrayIndexOutOfBoundsException: 0 at chat.pub.main(pub.java:105) 

这意味着你启动的程序没有给它的参数

然后,在线路105

pub chat = new pub(args[0],args[1],args[2]); 

要访问args来第0个元素时ARGS是空的。

重新运行程序并根据需要给出参数(3)。

编辑:

为了在Eclipse中运行时提供的参数:

运行 - >运行配置 - >选择酒馆(既然你已经尝试在Eclipse中运行它) - >选择参数 - >下程序参数指定由空格分隔

Pictorial View

+0

嗨,感谢您的帮助我编辑我的messeg后,你的帮助,我添加照片什么worng后,我这样做我wuld高兴的帮助 – user1346532

+0

很高兴成为帮助:)亲切接受答案,如果它帮助你 – mprabhat