【发布时间】: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 调用不会引发数字格式异常