我需要做的IRC客户端和我有一个问题的登录。我试图循环通过服务器输入,以找到按摩004或433,其中声明成功登录或登录在使用。这是我的密码:
import ecs100.*;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class ChatClient {
private String server = "irc.ecs.vuw.ac.nz";
private static final int IRC_PORT = 6667;
private static String nick;
private static String name;
private Socket socket;
private Scanner serverIn;
private PrintStream serverOut;
private String line;
private String channel;
// Constructor
public ChatClient (){
this.setupGUI();
}
public void setupGUI(){
UI.addButton("Connect", this::connect);
}
public void connect(){
try {
socket = new Socket(server,IRC_PORT);
serverIn = new Scanner(socket.getInputStream());
serverOut = new PrintStream(socket.getOutputStream());
UI.println("login");
this.login();
UI.println("listening");
this.listenToServer();
}catch(IOException e){UI.println("IO failure "+ e);}
}
private boolean login(){
String username = UI.askToken("Enter your usercode: ");
String realname = UI.askString("Enter your real name: ");
this.nick = username;
this.name = realname;
send("NICK " + username);
send("USER " + username + " 0 unused :" + realname);
UI.println("listening to server");
while(this.serverIn.hasNext()){
this.line = serverIn.nextLine();
UI.println("SERVER" + line);
if (line.indexOf("004") >= 0){
UI.println("true");
return true;
} else if(line.indexOf("433") >= 0){
UI.println("failed to connect, username already in use");
return false;
} else {
UI.println("else");
return false;
}
}
}
private void send(String msg){
serverOut.print(msg + "\r\n");
serverOut.flush();
}
private void listenToServer() {
while(this.serverIn.hasNext()){
String line = serverIn.nextLine();
UI.println("SERVER" + line);
if(line.equals("SQUIT")){
this.closeConnection();
}
if(line.equals("PING")){
String pingMsg = line.split(" ",2)[1];
this.send("PONG " + pingMsg);
}
}
}
public void closeConnection(){
try {
this.socket.close();
this.serverIn.close();
this.serverOut.close();
UI.println("Closed");
} catch(IOException e){UI.println("IO failure "+ e);}
}
public void joinChannel(){
String channel = UI.askString("Enter channel name: ");
send("JOIN " + channel);
}
public void leaveChannel(){
send("PART " + channel);
}
public static void main(String[] args) {
new ChatClient();
}
}问题是,在登录方法中,它一直保留丢失的返回语句。谁能看看我的代码,看看这里可能出了什么问题吗?
编辑:所以当我将if语句改为两个if's并将返回false放在循环之外时,程序就可以工作了。有人能解释一下while循环内部的if/ why语句为什么不能工作吗?
private boolean login(){
String username = UI.askToken("Enter your usercode: ");
String realname = UI.askString("Enter your real name: ");
this.nick = username;
this.name = realname;
send("NICK " + username);
send("USER " + username + " 0 unused :" + realname);
UI.println("listening to server");
while(this.serverIn.hasNext()){
this.line = serverIn.nextLine();
UI.println("SERVER" + line);
if (line.indexOf("004") >= 0){
UI.println("true");
return true;
}
if(line.indexOf("433") >= 0){
UI.println("failed to connect, username already in use");
return false;
}
}
UI.println("else");
return false;
}
enter code here发布于 2018-05-16 11:15:22
因为有一个代码路径会导致没有调用return,而编译器不能允许非空方法调用。
如果this.serverIn.hasNext()返回false,那么如果在末尾没有返回语句,该方法会返回什么?毕竟它需要返回一个boolean。
程序逻辑可能被写入,这样就不会使用特定的代码路径,但理论上是可能的,这就是编译器抱怨的原因。
https://stackoverflow.com/questions/50368681
复制相似问题