【问题标题】:Java - add a return statementJava - 添加返回语句
【发布时间】:2012-06-07 09:30:39
【问题描述】:

我正在学习 java,所以如果它看起来很基础,请耐心等待。我有一个方法,我试图编辑它以返回一个“读入”的值 - 我试图返回“移动”。但是,由于代码的设置,返回超出了代码块并迫使我返回 null。有人可以编辑代码以使其返回“移动”值吗?我已经为此工作了 2 天,但我无法解决 - 尝试和捕获似乎导致了问题

public Move listenToEngineMove()
{
  synchronized(engineReadBuffer)
  {
    int numRows=engineReadBuffer.size();

    if(numRows==0);

    for(int kk=0; kk<numRows; kk++)
    {
      String row=engineReadBuffer.get(kk);

      row=row.toLowerCase();

      if((row.contains("move "))||(row.contains(" ... ")))
        if((!row.contains("illegal"))&&(!row.contains("error")))
          try { 
            String[] tokens=row.replaceAll("\\<.*\\>"," ").split("\\s+");
            Move move = new Move(tokens[tokens.length-1]);
            jcb.makeAIsMove(move);

            System.out.println("thread.... " + row);
          }  
          catch (Exception x) {
            System.out.println("Exception! : "+x.getMessage());
          } 
    }

    engineReadBuffer.clear();
  }
  return null;
}

【问题讨论】:

  • “我正在学习 java ...” - 你需要学习的一件事是一致地缩进你的代码。
  • 没有证据表明您试图返回move - 您尝试了什么,明显的return move; 不起作用?
  • 正如@StephenC 所说。一旦你正确格式化它 - 你会看到返回的去向。看看这个:java.dzone.com/articles/10-best-practices-code

标签: java return


【解决方案1】:

试试这个:

public Move listenToEngineMove() {
    Move move = null;
    synchronized (engineReadBuffer) {
        int numRows = engineReadBuffer.size();
        if (numRows == 0) ;   // what on earth is this?
        for (int kk = 0; kk < numRows; kk++) {
            String row = engineReadBuffer.get(kk);
            row = row.toLowerCase();
            if ((row.contains("move ")) || (row.contains(" ... ")))
                if ((!row.contains("illegal")) && (!row.contains("error")))
                    try {
                        String[] tokens = row.replaceAll("\\<.*\\>", " ").split("\\s+");
                        move = new Move(tokens[tokens.length - 1]);
                        jcb.makeAIsMove(move);

                        System.out.println("thread.... " + row);
                    } catch (Exception x) {
                        System.out.println("Exception! : " + x.getMessage());
                    }
        }
        engineReadBuffer.clear();
    }
    return move;
}

我建议你替换这个:

catch(Exception x){System.out.println("Exception! : "+x.getMessage());} 

用这个:

catch(Exception e){
   e.printStackTrace();   // Or, better yet, logging with Log4J
} 

完整的堆栈跟踪提供比消息更多的信息。

这行在我看来是个错误。最后的分号看起来不合适。

if (numRows == 0) ;   // what on earth is this?

您的代码看起来很糟糕。我觉得很难阅读,因为您的缩进和一般代码风格不一致。风格很重要;它使您的代码更易于阅读和理解。采用更好的风格并坚持下去。

【讨论】:

  • 怎么样?你会改变什么?你的意思是重新格式化代码?完成。
  • 这不行,return语句在声明move的块之外。
【解决方案2】:

您需要将“移动”移动到同步块内,将其保持在同步块内以保持线程安全很重要。

public Move listenToEngineMove()
{
synchronized(engineReadBuffer)
  {
      Move move =null;

      int numRows=engineReadBuffer.size();
      if(numRows==0);

   for(int kk=0; kk<numRows; kk++)
     {
     String row=engineReadBuffer.get(kk);
     row=row.toLowerCase();

     if((row.contains("move "))||(row.contains(" ... ")))
      if((!row.contains("illegal"))&&(!row.contains("error")))
       try { 
        String[] tokens=row.replaceAll("\\<.*\\>"," ").split("\\s+");
        move = new Move(tokens[tokens.length-1]);

             System.out.println("thread.... " + row);
            }  
       catch(Exception x){System.out.println("Exception! : "+x.getMessage());} 
     }  
   engineReadBuffer.clear();
   return move;//this is inside synchronized block
  }
}

【讨论】:

  • 谢谢大家。 Return 语句现在可以正常工作,并且 cmets 采用了重新编码格式和一致性
猜你喜欢
  • 2015-08-23
  • 2011-01-03
  • 1970-01-01
  • 2015-05-03
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多