首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IRC登录缺失返回语句

IRC登录缺失返回语句
EN

Stack Overflow用户
提问于 2018-05-16 10:39:01
回答 1查看 43关注 0票数 0

我需要做的IRC客户端和我有一个问题的登录。我试图循环通过服务器输入,以找到按摩004或433,其中声明成功登录或登录在使用。这是我的密码:

代码语言:javascript
运行
复制
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语句为什么不能工作吗?

代码语言:javascript
运行
复制
  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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-16 11:15:22

因为有一个代码路径会导致没有调用return,而编译器不能允许非空方法调用。

如果this.serverIn.hasNext()返回false,那么如果在末尾没有返回语句,该方法会返回什么?毕竟它需要返回一个boolean

程序逻辑可能被写入,这样就不会使用特定的代码路径,但理论上是可能的,这就是编译器抱怨的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50368681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档