我有两个方法,一个用于检查给定值是否为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();
}
当我添加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版本编译和运行时才会出现错误( - &gt;从7_5到7_40测试了几个补丁)
有没有人知道这里的问题会是什么? 我可以提供一个包含所有代码的主类和一些带有测试字符串的文件,以便在有人感兴趣时重现该错误。
编辑:进一步的测试表明,错误确实只发生在Windows系统上。 linux上没有问题。
答案 0 :(得分:0)
解决。这是Java中的一个错误,似乎是用Java 7 Update45解决的