小心:用换行符拆分字符串可能会导致烦扰

时间:2018-03-24 16:01:27

标签: java arrays regex string split

按换行符拆分字符串会导致烦扰。请看我的答案。

原始问题 - 由于无法在日志中看到隐形字符而导致的XY问题。

public void DoCommand(String cmd)
{
    String [] words=cmd.split(" ");
    if (words == null)
    {
           Log.e(TAG, "Words null");
           return;
    }
    if (words.length == 0)
    {
         Log.e(TAG, "Words short");
        return;
    }
   String program=words[0].toLowerCase();
   Method method=commandmap.get(program);
    try
    {
        method.invoke(cmdimpl, (Object) words);
    } catch (IllegalAccessException |
            IllegalArgumentException |
            InvocationTargetException e)
    {
        Log.e(TAG, "invocation error", e);
        sender.SendError(e);
    }
    catch (NullPointerException e)
   {
        Log.e(TAG, "UNknown cmd", e);
                sender.SendError("unknown command "+program);
   }
    ...
}

这是cmdimpl中方法的一个示例。

public void DoHelp(String []args) throws IOException
{
    session.sender.Send(typeConverter.GetBatchInfo("",TypeConverter.FILETYPE.TEXTMSG, WorkerSession.commandmap.keySet().toString()));
}

因此,当我致电DoCommand("help")时,它会说“未知命令”。但是,当我致电DoCommand("help a")时,它可以正常工作。

有任何怀疑/建议来解决这个问题吗?

修改

我添加了一些代码来打印堆栈跟踪,但它不起作用。

catch (NullPointerException e)
{
    Log.e(TAG, "UNknown cmd"+program+".", e);
    sender.SendError("unknown command "+program+"-"+Log.getStackTraceString(e));
}

sender.SendError

  

“未知命令帮助”

,而不是

  

未知命令help-java.lang.NullPointerException:...

所以program似乎有问题。

编辑2

我突然想到CR LF/ CR / LF问题可能是一个关键点。

public void ExecuteCommands(String cmds)
{
    workerThread.AddCommand(cmds.split("\n"));  //this \n may be wrong?!
}

2 个答案:

答案 0 :(得分:2)

它将返回一个String [],其中包含一个元素,即原始字符串。

您可以通过以下方式进行测试:

String word="Hello";
String [] words=word.split(" ");
if (words == null) {
  System.out.print("NULL");
} else {
  System.out.println(words.length);
  System.out.println(words[0]);
}

答案 1 :(得分:1)

非常感谢大家!我的实际问题来自

 String.split("\n");

。当我把它改成

 String.split("\\r?\\n");

根据这个问题Split Java String by New Line

问题已经消失。

再次感谢您的回答和评论:)