按换行符拆分字符串会导致烦扰。请看我的答案。
原始问题 - 由于无法在日志中看到隐形字符而导致的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?!
}
答案 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,
问题已经消失。
再次感谢您的回答和评论:)