我已经开始用Java学习套接字编程了。我从tutorialspoint.com复制了代码并在Eclipse中运行它。但是编译器给了我一个ArrayIndexOutOfBoundsException
例外。
这是我的代码:
//File Name GreetingClient.java
import java.net.*;
import java.io.*;
public class GreetingClient {
public static void main(String[] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("Connecting to " + serverName + " on port "
+ port);
Socket client = new Socket(serverName, port);
System.out.println("Just connected to "
+ client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里发生了什么?
答案 0 :(得分:1)
从代码的外观来看,您必须忘记指定命令行参数。 String[] args
包含参数,如果您没有指定任何参数,则数组不会有大小。在没有大小的情况下访问它会为您提供ArrayIndexOutOfBoundsException
。
要解决此问题,只需在运行应用程序时指定命令行参数即可。如果从命令提示符运行,则在键入java MyClass
后指定它。在Eclipse中,您可以在项目的运行配置中指定它们。
对于您的应用程序,您需要2个参数。第一个应该是您要连接的服务器的主机名,第二个应该是它绑定到的端口。
此外,这是运行时异常,而不是编译时错误。
答案 1 :(得分:-2)
在你的情况下,
public static void main(String[] args) { // parameter is an array
// which is arguments which you pass when you run the app
// either through console from where you are running your java file
// or from setting in IDE
}
它的作用是将你在控制台中提供的所有参数分隔为空格并将其放入数组并作为参数传递给main函数。
如果你没有传递任何东西,你将收到错误
// here you should have args[0] and args[1] ,
// meaning you should have args array with 2 elements in it.
String serverName = args[0];
int port = Integer.parseInt(args[1]);
// you will get error if array doesnot contain anything ar just 1 element.
从命令行,在编译java代码后运行它
java javaFileClassName arg1 arg2
如果您是从eclipse运行它,请转到
Run > Arguments tab > type your all arguments there
如果您正在使用,请参阅此处 命令行 Providing command line arguments