我有两种方法,一种是检查给定值是否为 NULL、字符串“NULL”或空字符串。另一个用 html 编码值替换 html 特定字符并插入空格以启用换行符等(参见下面的代码)。第二种方法使用第一种方法在做任何工作之前检查给定的值。
public static String checkForNull(String aString, String aReturnValue)
{
String tBack = aString;
if ((aString == null) || (aString.equalsIgnoreCase("null")) || (aString.trim().equals("")))
{
tBack = aReturnValue;
}
return tBack;
}
public static String encodeAsHTMLEntities(String aValue, boolean aLineBreakAsBR, String[] aUnencodedParts,
boolean aInsertRatedSpace, int aMinimalWordSize)
{
StringBuilder tResult = new StringBuilder();
if(StringUtils.checkForNull(aValue, null) != null)
{
String tTempValue = aValue;
List<String> tUnencodedPartList = new ArrayList<String>();
if(aUnencodedParts != null)
{
tUnencodedPartList.addAll(Arrays.asList(aUnencodedParts));
}
/* Replace all linebreaks by HTML-tag if needed. */
if (aLineBreakAsBR == true)
{
tTempValue = tTempValue.replaceAll("\n", "<br />");
/* Add the br tag to the array containing parts that must not be encoded. */
tUnencodedPartList.add("<[Bb][Rr]\\s*[/]?>");
}
/* HTML-encode the value. */
int tCharsAfterLastSplitSymbol = 1;
Pattern tPattern = Pattern.compile("[\\s\\-,.;:]");
String tSplitterInvisible = "​";
String tSplitterVisible = "­";
if (aMinimalWordSize < 1)
{
aMinimalWordSize = Constants.MINIMAL_WORD_SIZE_BEFORE_SEPARATING;
}
for (int i = 0; i < tTempValue.length(); i++)
{
/* Test if we have an exception for the following value. */
boolean tIsAllowed = false;
String tStringToCheck = tTempValue.substring(i);
for (int t = 0; t < tUnencodedPartList.size() && tIsAllowed == false; t++)
{
String tUnencodedPart = tUnencodedPartList.get(t);
String tMatchingString = tStringToCheck.substring(0, tStringToCheck.length() - tStringToCheck.replaceFirst("^(" + tUnencodedPart + ")", "").length());
if (tMatchingString.length() > 0)
{
if (aInsertRatedSpace == true)
{
tResult.append(tSplitterInvisible);
}
tIsAllowed = true;
i += tMatchingString.length() - 1;
tResult.append(tMatchingString);
if (aInsertRatedSpace == true)
{
tResult.append(tSplitterInvisible);
}
}
}
if (tIsAllowed == false)
{
char tChar = tTempValue.charAt(i);
/* Add the encoded char */
tResult.append(encodeAsHTMLEntity(tChar));
/* Add splitter */
if (aInsertRatedSpace == true)
{
/* Check the character for beeing one of our split symbols */
Matcher tMatcher = tPattern.matcher(Character.toString(tChar));
String tSplitter = "";
if (tCharsAfterLastSplitSymbol >= aMinimalWordSize)
{
boolean tUseVisibleSplitter = true;
if (tMatcher.find())
{
tUseVisibleSplitter = false;
}
else
{
/* Check if next character matches to our reg exp */
if (tTempValue.length() >= (i + 2))
{
tChar = tTempValue.charAt(i+1);
tMatcher = tPattern.matcher(Character.toString(tChar));
if (tMatcher.find())
{
tUseVisibleSplitter = false;
}
}
/* Check if the next characters matches to one of our unencoded parts */
if (tUseVisibleSplitter)
{
String tNextStringToCheck = tTempValue.substring(i+1);
for (int t = 0; t < tUnencodedPartList.size() && tUseVisibleSplitter == true; t++)
{
String tUnencodedPart = tUnencodedPartList.get(t);
String tMatchingString = tNextStringToCheck.substring(0, tNextStringToCheck.length() - tNextStringToCheck.replaceFirst("^(" + tUnencodedPart + ")", "").length());
if (tMatchingString.length() > 0)
{
tUseVisibleSplitter = false;
}
}
}
}
/* Choose the correct splitting symbol */
if (tUseVisibleSplitter)
{
tSplitter = tSplitterVisible;
}
else
{
tSplitter = tSplitterInvisible;
}
tCharsAfterLastSplitSymbol = 1;
}
else
{
if (tMatcher.find())
{
tSplitter = tSplitterInvisible;
tCharsAfterLastSplitSymbol = 1;
}
else
{
tCharsAfterLastSplitSymbol++;
}
}
tResult.append(tSplitter);
}
}
else
{
tCharsAfterLastSplitSymbol = 1;
}
}
}
return tResult.toString();
}
当我添加 a来检查它的返回时,该checkForNull()
方法总是返回正确的值。System.out.println()
在方法中,对该方法encodeAsHTMLEntities()
的调用checkForNull()
突然停止工作并且if(StringUtils.checkForNull(aValue, null) != null)
不再输入。我可以将结果StringUtils.checkForNull(aValue, null)
放入另一个变量并打印这个变量,返回的值总是正确的。如果我使用If
来检查此变量是否不为空,则代码也会失败。
我发现了两种使代码工作的方法。第一个是这样写checkForNull()
:
public static String checkForNull(String aString, String aReturnValue)
{
String tBack = aString;
if (aString == null)
{
tBack = aReturnValue;
}
else if (aString.equalsIgnoreCase("null")
{
tBack = aReturnValue;
}
els if (aString.trim().equals(""))
{
tBack = aReturnValue;
}
return tBack;
}
第二种是在调试模式下运行代码,即向vm添加调试参数或在代码中添加任何调试语句。(这就是使用的原因System.out.println()
,因为任何调试尝试都可以解决问题,所以在这种情况下调试器确实没有帮助)
该代码在应用程序中运行多年,在使用 Java6 32Bit、Java6 64Bit 和 Java7 32Bit 编译和运行时没有问题。该错误仅在使用 Java7 64Bit 版本编译和运行时发生(-> 测试了从 7_5 到 7_40 的几个补丁)
有谁知道这里的问题可能是什么? 如果有人感兴趣,我可以提供一个包含所有代码和一些带有测试字符串的文件的主类来重现错误。
编辑:进一步的测试表明该错误只发生在 Windows 系统上。linux上没有问题。