【问题标题】:Nested do-while loop in if-else: variable not initializedif-else 中的嵌套 do-while 循环:变量未初始化
【发布时间】:2014-07-23 09:53:18
【问题描述】:

我遇到了在 Eclipse 中反复出现的错误。我认为这个错误不应该存在。给定以下嵌套循环:

String conditionlogic;
if(matcher.find())
{               
    do
        conditionogic += matcher.group();
    while(matcher.find());
}
else
    conditionogic = null;

错误是

可能没有初始化局部变量conditionlogic。

我的理解是,因为 do-while 将至少执行一次条件逻辑实际初始化为 matcher.group() 的一个或多个值,否则为 null。 我该如何解决这个问题?

【问题讨论】:

  • 将 { } 与 do 和 while 一起使用

标签: java loops initialization syntax-error nested-loops


【解决方案1】:

这行是什么意思:

conditionogic += matcher.group();

这与:

conditionogic = conditionogic + matcher.group();

即这意味着:取conditionogic 的值并连接到它matcher.group()。但是当你第一次进入循环时,conditionogic 的值确实是未知的。你必须给这个变量赋值,例如空字符串:

String conditionlogic = "";

【讨论】:

  • +1。我想与允许+= 在Java 中的字符串上使用的人进行相当有力的对话。不允许运算符重载的语言中的混杂;在我看来。
  • @Bathsheba,对初学者宽容一点。您不能期望每个开始学习 java 的人都使用 StringBulder 或 guava Joiner 进行字符串连接。
  • 谢谢。我意识到 -.- 为什么我不应该在字符串上使用 +=?提到的其他方法的优点是什么?
  • String 是不可变的,即它的内容永远不会改变。当您编写res = s1 + s2 时,您会创建String 的附加实例。当您在循环中执行此操作时,附加对象的数量就像您的迭代次数。 StringBuilder 通过累积块并在所有连接完成后创建最终字符串来解决此问题。
【解决方案2】:

由于您使用的是conditionogic += matcher.group();+= 运算符),因此您必须使用空字符串"" 初始化您的conditionlogic,如下所示:

String conditionlogic = "";

【讨论】:

    【解决方案3】:

    您的问题是+= 运算符。如果变量未初始化,你+= 会做什么?

    您可能希望将值初始化为""

    【讨论】:

      【解决方案4】:

      如果您仔细查看您的代码,您会尝试将matcher.group() 的结果连接到null。该错误完全有效,您应该将 conditionLogic 初始化为""

      但是,目前这并不是很好的做法,在循环中连接这样的字符串。正确的做法是:

      String conditionLogic = null;
      if(matcher.find())
      {
          StringBuffer sb = new StringBuffer();
          do
          {
              sb.append(matcher.group());
          }
          while(matcher.find());
          conditionLogic = sb.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多