gpt4 book ai didi

java - 尝试从 URL 读取文本时抛出异常

转载 作者:行者123 更新时间:2023-12-01 15:38:54 24 4
gpt4 key购买 nike

我是 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());

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

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

最佳答案

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

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)

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

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

关于java - 尝试从 URL 读取文本时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8401044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com