-5

私は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;
}
4

2 に答える 2

4

これを試して:

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?

あなたのコードはひどいようです。インデントと一般的なコードスタイルに一貫性がないため、読みにくいと思います。スタイルが重要です。コードを読みやすく、理解しやすくします。より良いスタイルを採用し、それに固執します。

于 2012-06-02T12:07:37.033 に答える
2

'Move'を同期ブロック内に移動する必要があります。スレッドセーフを維持するために、同期ブロック内に保持することが重要です。

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
  }
}
于 2012-06-02T12:12:54.297 に答える