问题描述
我有三个java文件一个是RMI服务器和RMI客户端和接口文件,如下: 服务器:
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.net.*;
public class RmiServer extends
java.rmi.server.UnicastRemoteObject implements ReceiveMessageInterface{
String address;
Registry registry;
public void receiveMessage(String x) throws remoteexception{
System.out.println(x);
}
public RmiServer() throws remoteexception{
try{
address = (InetAddress.getLocalHost()).toString();
}
catch(Exception e){
System.out.println("can't get inet address.");
}
int port=3233;
System.out.println("this address=" + address + ",port=" + port);
try{
registry = LocateRegistry.createRegistry(port);
registry.rebind("rmiServer",this);
}
catch(remoteexception e){
throw e;
}
}
static public void main(String args[]){
try{
RmiServer s = new RmiServer();
}
catch (Exception e){
e.printstacktrace();
System.exit(1);
}
}
}
客户:
import java.rmi.*;
import java.rmi.registry.*;
import java.net.*;
public class RmiClient{
static public void main(String args[]){
ReceiveMessageInterface rmiServer;
Registry registry;
String serverAddress=args[0];
String serverPort=args[1];
String text=args[2];
System.out.println
("sending " + text + " to " +serverAddress + ":" + serverPort);
try{
registry=LocateRegistry.getRegistry
(serverAddress,(new Integer(serverPort)).intValue());
rmiServer=(ReceiveMessageInterface)(registry.lookup("rmiServer"));
// call the remote method
rmiServer.receiveMessage(text);
}
catch(remoteexception e){
e.printstacktrace();
}
catch(NotBoundException e){
e.printstacktrace();
}
}
}
界面:
import java.rmi.*;
public interface ReceiveMessageInterface extends Remote{
void receiveMessage(String x) throws remoteexception;
}
所以基本上,当我运行服务器时,它会提供我的笔记本电脑地址和正在运行的端口,并且运行良好 但是,问题是当我在运行服务器后运行客户端时,它不断抛出此错误:
线程“main”中的异常java.lang.Arrayindexoutofboundsexception: 索引 0 超出长度 0 的边界
哪个客户端文件在哪一行:
String serverAddress=args[0];
解决方法
如果你看一下方法“static public void main(String args[])”,String args[] 是一个标准约定。当您以您使用的方式调用您的程序时,您应该在命令行中将值传递给这个数组。
出现异常的原因是,您的数组中没有 args[0],因为您没有传递值。当您在程序中访问 args[0]、args[1] 和 args[2] 时,请确保在调用程序时通过命令行传递三个值。
示例:
public class X{
public static void main (String[] args) {
for (String s: args) {
System.out.println(s);
}
}
}
如何运行
java X a ab abc
预期结果
一个
ab
ABC
,由于没有传递给 main 方法的参数值,这就是它抛出错误的原因。
我相信您没有将命令行参数分配给 main 方法。 如果您使用任何 IDE 来运行项目,请搜索如何在项目执行期间传递参数。
您可以在此处找到如何为 Netbeans IDE 配置参数 - Netbeans how to set command line arguments in Java
如果您正在使用任何其他 IDE,那么类似地搜索。
否则,您只需通过命令提示符运行即可向程序提供命令行参数。