If语句在Java7_25 64Bit中评估错误

时间:2013-10-15 12:03:30

标签: 64-bit java-7

我有两个方法,一个用于检查给定值是否为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 = "&#8203;";
  String tSplitterVisible = "&#173;";

  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上没有问题。

1 个答案:

答案 0 :(得分:0)

解决。这是Java中的一个错误,似乎是用Java 7 Update45解决的