-1

我正在使用 java Microsoft Translator API,但遇到了 Translator 卡住的问题;不翻译也不抛出任何异常。我曾尝试使用 Future 方法来检测超时,但即使这样也无济于事。代码无异常停止。这是我的代码。有什么问题吗?我能做些什么来解决它。

import com.memetix.mst.language.Language;
import com.memetix.mst.translate.Translate;

public class Translate
{
 public static String translate (String word)
 {
   Translate.setClientId("My ID");
   Translate.setClientSecret("My Secret");

   ExecutorService executor = Executors.newCachedThreadPool();

   Callable<String> task = new Callable<String>()
   {
    public String call()
    {
     try
     {
      String translatedWord = Translate.execute(currentWord, Language.FRENCH, Language.ENGLISH);
      return translatedWord;
     }
     catch (Exception e)
     {
      return "I don't know";
     }
    }
   };

   Future<String> future = executor.submit(task);
   try
   {
    String result = future.get(5, TimeUnit.SECONDS);
    System.out.println(result);
    return result;
   } 
   catch (Exception e) 
   {
    System.out.println("failed");
    future.cancel(true);
    return "I don't know";
   }
 }

 public static void main (String args[])
 {
  String frenchWord = "Bonjour";
  String englishWord = translate(frenchWord);
  System.out.println(englishWord);
 }
}

当我在调用方法中替换翻译行时,一切正常。但是, Translate.execute(...) 似乎导致了问题。

4

1 回答 1

0

捕获并记录Throwable,而不仅仅是Exception。那些 Executor/ThreadPoolExecutor 的东西在记录失败和抛出的错误方面做得很差,这将杀死一个线程并且永远不会解释原因。

哦,当你捕捉到一个异常时——记录它。否则下一个编写你的代码的程序员将不得不为你的罪鞭打你。甚至e.printStackTrace( System.out)总比没有好一千倍。

翻译器是否工作一次?“卡住”意味着它确实如此,但你并不清楚。清楚。

尝试在调试器中获取堆栈转储,或在控制台中按 Ctrl-Break(它不会杀死程序)。奇怪的是它不会告诉你任何事情,因为 ClassNotFound 已经杀死了线程池,但你不妨试试。

于 2013-07-13T01:21:54.377 回答