字符串比较-JAVA

字符串比较-JAVA,java,string,Java,String,好的,我知道“我如何比较字符串”这个问题有数百万个答案,但我已经确定我已经尽可能多地研究来解决我的问题,但我找不到答案 我正在用java制作一个网络聊天服务器和客户端,它使用DatagramSockets在udp上运行(即使tcp上的流更有意义)。我想知道当用户键入exit时,如何退出聊天程序的任意一侧。为了获得用户输入,我使用了一个扫描器,我在类getter.getMessage中声明了这个扫描器。以下是我正在编写的代码: getter.getMessage(); String pTest =

好的,我知道“我如何比较字符串”这个问题有数百万个答案,但我已经确定我已经尽可能多地研究来解决我的问题,但我找不到答案

我正在用java制作一个网络聊天服务器和客户端,它使用
DatagramSockets
在udp上运行(即使tcp上的流更有意义)。我想知道当用户键入
exit
时,如何退出聊天程序的任意一侧。为了获得用户输入,我使用了一个
扫描器
,我在类
getter.getMessage
中声明了这个扫描器。以下是我正在编写的代码:

getter.getMessage();
String pTest = getter.smessage;
if(pTest.equals("exit")) {
  System.out.println("System going offline");
  getter.isOn = false;
}
每次在while循环中,即使用户输入处于退出状态,也会忽略这一点。我还尝试:

if(getter.message.toLowerCase().Equals("exit") {
  //blah
}
我最初尝试不将getter.message放入
字符串pTest
,但它就是不想工作。我做错了什么?

试试这个:

if ("exit".equalsIgnoreCase(getter.message.trim())) {
    . . .
}
编辑

您在评论中提到,当您希望退出时,您将收到11个字符(在调用
trim()
后为10个字符)。这表明编码与数据不匹配。也许服务器正在发送UTF-16数据,其开头带有字节顺序标记。(这将解释字节数。)如果使用平台默认编码(通常为ISO-8859-1或UTF-8)读取,则将每个字节转换为一个字符,它将永远不会匹配
“exit”
。您需要使编码的两面都匹配

一旦知道用于发送数据的编码,就可以使用采用字符编码的构造函数创建
扫描仪。例如,它可能是:

Scanner scanner = new Scanner(inputStream, "UTF-16");
试试这个:

if ("exit".equalsIgnoreCase(getter.message.trim())) {
    . . .
}
编辑

您在评论中提到,当您希望退出时,您将收到11个字符(在调用
trim()
后为10个字符)。这表明编码与数据不匹配。也许服务器正在发送UTF-16数据,其开头带有字节顺序标记。(这将解释字节数。)如果使用平台默认编码(通常为ISO-8859-1或UTF-8)读取,则将每个字节转换为一个字符,它将永远不会匹配
“exit”
。您需要使编码的两面都匹配

一旦知道用于发送数据的编码,就可以使用采用字符编码的构造函数创建
扫描仪。例如,它可能是:

Scanner scanner = new Scanner(inputStream, "UTF-16");

这可能是空白/空白的问题。试试下面的代码

if (getter.message.toLowerCase().trim().Equals("exit") )
{
   //blah
}

这可能是空白/空白的问题。试试下面的代码

if (getter.message.toLowerCase().trim().Equals("exit") )
{
   //blah
}

我假设getter.message正在返回一些内容。您是否尝试过检查从getter.message返回的字符串的“长度”


我从未尝试过这样的事情,但在AJAX中遇到了类似的问题。从服务器返回的字符串长度大于我正在比较的字符串。在比较之前,我必须删除不需要的空格。

我假设getter.message返回了一些内容。您是否尝试过检查从getter.message返回的字符串的“长度”



我从未尝试过这样的事情,但在AJAX中遇到了类似的问题。从服务器返回的字符串长度大于我正在比较的字符串。在比较之前,我必须删除不需要的空格。

您需要调试它。在调用getMessage()之前和之后打印getter.smessage,看看它是否真的有效。也许有你想要修剪的尾随空格?也许smessage包含新行?在这种情况下,
“exit\n”.equals(“exit”)
也将返回false,最好执行
“exit”.equals(pTest)
以避免空指针异常。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊哈哈哈哈哈哈哈哈打印新行的可能性很大,让我看看。。。在scanner中,我使用的是nextLine(),使用equalsIgnoreCase如何?您需要调试它。在调用getMessage()之前和之后打印getter.smessage,看看它是否真的有效。也许有你想要修剪的尾随空格?也许smessage包含新行?在这种情况下,
“exit\n”.equals(“exit”)
也将返回false,最好执行
“exit”.equals(pTest)
以避免空指针异常。啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊哈哈哈哈哈哈哈哈打印新行的可能性很大,让我看看。。。在scanner中,我使用的是nextLine(),使用equalsIgnoreCase如何?当我使用trim()时,大小是10,即使pTest应该是exit。当我使用trim()时,大小是10,即使pTest应该是exit。+1。我更喜欢这个而不是另一个。我真的不知道还有什么原因。好吧,据我所知,双方应该使用相同的编码,因为他们在同一台机器上运行,并且没有声明任何地方可以使用任何其他编码,我将粘贴到客户端Ok,所以我只调用个别方法,这样我就可以调用getter.getMessage(inputStream,utf-16“)@Charlie-您肯定是在使用默认编码来读取
System.in
。我没有看到任何证据证实这是问题所在,但我强烈怀疑这一点。尝试将原始字节读入字节数组,并使用调试器检查它们(或以十六进制打印它们)。除了UTF-16(例如base-64)之外,还有其他编码将使字节数加倍。好吧,我会研究一下,整个项目是为了明天的演示,我已经超出了他们的要求,所以我将把它留到上午,并与我的一位讲师讨论。谢谢你的帮助:-)+1。我更喜欢这个而不是另一个。我真的不知道还有什么原因。好吧,据我所知,双方应该使用相同的编码,因为他们在同一台机器上运行,并且没有声明任何地方可以使用任何其他编码,我将粘贴到客户端Ok,所以我只调用个别方法,这样我就可以调用getter.getMessage(inputStream,utf-16“)@查理-你肯定是在