【问题标题】:Exception thrown when trying to read text from a URL尝试从 URL 读取文本时引发异常
【发布时间】:2011-12-06 22:28:28
【问题描述】:

我是 Android/Java 的相对新手,并且对我似乎无法解决的问题感到绝望:我正在尝试从 XML API 网站读取一些数据点。由于我需要连续读取五个不同的 API 调用,并且网站上有很多数据(每个大约 1.3kB),我认为最好将整个内容作为文本读取,然后简单地解析它以获得我的数据需要。我正在使用此代码:

      char[] buffer = new char[16384];

      for (cnt=0; cnt<numcities; cnt++)
        {
            try 
              {
              url = new URL(urlStrings[cnt]);
              urlConnection = (HttpURLConnection) url.openConnection();

              try 
                {
                inStream = new BufferedInputStream(urlConnection.getInputStream());

                if (inStream != null)
                  {
                  try 
                     {
                    reader = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));

                     while ((charcount = reader.read(buffer)) != -1) 
                       {
                       writer.write(buffer, 0, charcount);
                       }
                     } 
                   finally 
                     {
                     inStream.close();
                    inputLine = writer.toString();
                    }
                  }
                } 
              finally 
                {
                urlConnection.disconnect();
                }
              }
        catch (MalformedURLException e) 
          {
          }
        catch (IOException e) 
          {
          e.printStackTrace(); 
          }

      if (inputLine != null)
        {
// process the text and extract the data; the data points from five API calls all end up in one string eventually
   }
} // end for loop

这段代码在上周之前运行良好;突然(我没有更改任何内容),应用程序在模拟器和我的手机(上周工作的同一个应用程序!)上崩溃,并抛出异常,如下所示:

threadid=7: thread exiting with uncaught exception (group=0x4001d800)
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
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 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)
Caused by: java.lang.NumberFormatException: 
at org.apache.harmony.luni.util.FloatingPointParser.parseFltImpl(Native Method)
at org.apache.harmony.luni.util.FloatingPointParser.parseFloat(FloatingPointParser.java:321)
at java.lang.Float.parseFloat(Float.java:291)
at java.lang.Float.valueOf(Float.java:330)
at com.gbg.android.china.ShowInfoQuif$DownloadROETask.doInBackground(ShowInfoQuif.java:270)
at com.gbg.android.china.ShowInfoQuif$DownloadROETask.doInBackground(ShowInfoQuif.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more

顺便说一下,我要阅读的是 Google 的天气 API。它看起来像这样:

<?xml version="1.0"?><xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
  ...
</weather>
</xml_api_reply>

添加一些调试代码表示异常是由这行触发的:

                    inStream = new BufferedInputStream(urlConnection.getInputStream());

奇怪的是,异常并不总是同时发生。通常,当调用第二个 URL 时,它发生在 cnt=1 上。但是,应用程序有时会在第一个、第三个或最后一个崩溃。另一个有趣的事情是调试信息表明所有五个 URL 都被正确读取并返回了预期的结果,即使 Android 随后退出了应用程序。这里有什么问题?

我知道我使用的固定缓冲区大小并不理想,但我怀疑这不是问题所在。有人对如何使这项工作或至少如何捕获异常有建议吗?我一定会很感激的!

【问题讨论】:

  • ShowInfoQuif.java:270 在此行附近的某处,您正在解析字符串并尝试将其转换为数字,该数字本身不是数字......或者必须是其中的一些特殊字符。 ....为此,您必须检查 URL 返回的输出.....我认为 gettingInputStream 调用不会引发数字格式异常

标签: java android


【解决方案1】:

问题似乎与您的 URL 下载代码无关。堆栈跟踪引导您在ShowInfoQuif.java 的第 270 行调用Float#valueOf(String)

引起:java.lang.NumberFormatException: 在 org.apache.harmony.luni.util.FloatingPointParser.parseFltImpl(本机方法) 在 org.apache.harmony.luni.util.FloatingPointParser.parseFloat(FloatingPointParser.java:321) 在 java.lang.Float.parseFloat(Float.java:291) 在 java.lang.Float.valueOf(Float.java:330) 在 com.gbg.android.china.ShowInfoQuif$DownloadROETask.doInBackground(ShowInfoQuif.java:270)

传递给 Float#valueOf(String) 的 String 参数不是可识别的浮点数格式。

看看你是否可以追踪到无效的String 值是从哪里来的。使用Log#d(String, String) 调用 Float#valueOf(String) 之前记录字符串可能会有所帮助。

【讨论】:

  • 普拉沙姆,丹尼尔,你们都说得对。愚蠢的我 - 我太关注错误始终发生的地方,并且不认为这是一个异步函数,所以真正的问题在其他地方。非常感谢你们让我重回正轨!
  • @Lon 和我们程序员:这种-你指的-愚蠢很常见.....去呼吸新鲜空气......你需要按下你身体的F5然后介意:)
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多