代码之家  ›  专栏  ›  技术社区  ›  칼인오

致命异常:AsyncTask#1:java。lang.RuntimeException:执行doInBackground()时出错

  •  1
  • 칼인오  · 技术社区  · 7 年前

    我正在尝试使用Microsoft文本转换器API将一种语言翻译成另一种语言。我已经在java上做过了,但当我把它移植到Android上时。它给了我这个错误。它似乎在向我指出IOUtils,但我认为我已经在项目结构中添加了这个先决条件。无论如何,有没有不使用IOUtils?。比如OutputStream?。看起来IOUtils是个问题,但IDK。我无法理解logcat错误:/

    我的日志在这里:

    E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                      java.lang.RuntimeException: An error occured while executing doInBackground()
                          at android.os.AsyncTask$3.done(AsyncTask.java:299)
                          at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
                          at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
                          at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
                          at java.util.concurrent.FutureTask.run(FutureTask.java:137)
                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
                          at java.lang.Thread.run(Thread.java:856)
                       Caused by: java.lang.ExceptionInInitializerError
                          at org.apache.commons.io.IOUtils.write(IOUtils.java:2049)
                          at com.example.joshu.translatorownimplementation.MainActivity.translate(MainActivity.java:101)
                          at com.example.joshu.translatorownimplementation.MainActivity$LongOperation.doInBackground(MainActivity.java:70)
                          at com.example.joshu.translatorownimplementation.MainActivity$LongOperation.doInBackground(MainActivity.java:55)
                          at android.os.AsyncTask$2.call(AsyncTask.java:287)
                          at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
                          at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                          at java.lang.Thread.run(Thread.java:856) 
                       Caused by: java.lang.NoClassDefFoundError: java.nio.charset.StandardCharsets
                          at org.apache.commons.io.Charsets.<clinit>(Charsets.java:120)
                          at org.apache.commons.io.IOUtils.write(IOUtils.java:2049) 
                          at com.example.joshu.translatorownimplementation.MainActivity.translate(MainActivity.java:101) 
                          at com.example.joshu.translatorownimplementation.MainActivity$LongOperation.doInBackground(MainActivity.java:70) 
                          at com.example.joshu.translatorownimplementation.MainActivity$LongOperation.doInBackground(MainActivity.java:55) 
                          at android.os.AsyncTask$2.call(AsyncTask.java:287) 
                          at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
                          at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
                          at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
                          at java.lang.Thread.run(Thread.java:856) 
    

    这是我的代码:

    import org.apache.commons.io.IOUtils;
    
    import java.io.BufferedReader;
    import java.io.OutputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import javax.net.ssl.HttpsURLConnection;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class MSTranslateAPI {
    
       private static String output;
    
        private static String key = "<MS KEY for Translator API>";
    
    
      public static void main(String[] args) throws Exception {
        // TODO: Specify your translation requirements here:
        String fromLang = "en";
        String toLang = "ko";
        String text = "Hello Friend";
    
        MSTranslateAPI.translate(fromLang, toLang, text);
    
      }
    
    
      public static void translate(String fromLang, String toLang, String text) throws Exception {
    
         String authenticationUrl = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
        HttpsURLConnection authConn = (HttpsURLConnection) new URL(authenticationUrl).openConnection();
        authConn.setDoOutput(true);
        authConn.setRequestMethod("POST");
        authConn.setRequestProperty("Ocp-Apim-Subscription-Key", key);
        IOUtils.write("", authConn.getOutputStream(), "UTF-8");
        String token = IOUtils.toString(authConn.getInputStream(), "UTF-8");
        authConn.disconnect();
    
        System.out.println("TOKEN: "+token);
    
    
    
    
        if(authConn.getResponseCode()==200) {
             String appId = URLEncoder.encode("Bearer " + token, "UTF-8");
        String text2 = URLEncoder.encode(text, "UTF-8");
        String from = fromLang;
        String to = toLang;            
        String translatorTextApiUrl ="https://api.microsofttranslator.com/v2/http.svc/GetTranslations?appid="+appId+"&text="+text2+"&from="+from+"&to="+to+"&maxTranslations=5";
    
    
        HttpsURLConnection translateConn = (HttpsURLConnection) new URL(translatorTextApiUrl).openConnection();
        translateConn.setRequestMethod("POST");         
        translateConn.setDoOutput(true);
        IOUtils.write("", translateConn.getOutputStream(), "UTF-8");
        String resp = IOUtils.toString(translateConn.getInputStream(), "UTF-8");
        translateConn.disconnect();
        System.out.println(resp+"\n\n");
        }
        else    {
    
        }
    
    
    
    
    
    
      }
    
    
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   twinklehawk    7 年前

    logcat消息中的堆栈跟踪表明StandardCharsets类不可用。根据 https://developer.android.com/reference/java/nio/charset/StandardCharsets.html ,该类在android JDK中,但需要API版本19或更高版本。如果你想继续使用IOUtils,你可以升级你的目标安卓版本。

        2
  •  1
  •   칼인오    7 年前

    顺便说一句,我的应用程序没有崩溃,但即使我已经使用了上面的API 21,它也不会处理我的IOUtils任务(我教过的API 21已经在工作了,因为在编译过程中,它不会给出一个特定的错误,除了日志上的错误,如果不是因为上面接受的答案,我无法读取/理解)。IOUtils似乎与安卓完全不兼容?。因为在我的应用程序中,即使有适当的依赖项导入(即使那些依赖项/jar文件已经在我的java版本中工作),我也会继续处理logcat错误/根本没有输出。所以我所做的是,我完全摆脱了IOUtils,并通过手动硬编码自己的方法来完成分配给它的任务,结果证明它在没有更多IOUtils导入的情况下工作得很好。事实证明,导入IOUtils的困难是不值得的,你最好自己硬编码它所做的事情,这在我的例子中是非常基本的。或者至少就我而言,我硬编码了IOUtils代码部分,这样我就可以完全替换它,并专门为我的应用程序工作。