2 つの方法があります。1 つは指定された値が NULL、文字列「NULL」、または空の文字列であることを確認する方法です。もう1つは、html固有の文字をhtmlエンコードされた値に置き換え、スペースを挿入して改行などを有効にするものです(以下のコードを参照)。2 番目の方法は、最初の方法を使用して、作業を行う前に指定された値をチェックします。
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()
methodで、メソッドencodeAsHTMLEntities()
の呼び出しがcheckForNull()
突然機能しif(StringUtils.checkForNull(aValue, null) != null)
なくなり、もう入力されません。StringUtils.checkForNull(aValue, null)
の結果を別の変数に入れて、これを出力することができ、戻り値は常に正しいです。を使用しIf
てこの変数が null でないことを確認すると、コードも失敗します。
コードを機能させる 2 つの方法を発見しました。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;
}
2 つ目は、コードをデバッグ モードで実行することです。これは、デバッグ パラメーターを vm に追加するか、デバッグ ステートメントをコードに追加することを意味します。(これが を使用する理由ですSystem.out.println()
。デバッグを試みると問題が解決するため、この場合、デバッガーは実際には役に立ちません)
このコードはアプリケーションで何年も問題なく動作し、Java6 32Bit、Java6 64Bit、および Java7 32Bit でコンパイルして実行しても問題ありません。このエラーは、Java7 64Bit バージョンでコンパイルして実行した場合にのみ発生します (-> 7_5 から 7_40 までのいくつかのパッチをテストしました)。
ここで問題が発生する可能性があることを知っている人はいますか? すべてのコードとテスト文字列を含むいくつかのファイルを含むメイン クラスを提供して、興味がある場合はエラーを再現できます。
編集:さらにテストした結果、エラーは Windows システムでのみ発生することが示されました。Linux では問題ありません。