您的位置:首页 > 运维架构 > Apache

SAX解析错误,org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)

2016-03-18 16:35 645 查看
03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: FATAL EXCEPTION: main

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{tech.androidstudio.xmlpullparserdemo/tech.androidstudio.xmlpullparserdemo.MainActivity}: java.lang.NumberFormatException:

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.access$1500(ActivityThread.java:117)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.os.Looper.loop(Looper.java:123)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:3683)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:507)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: Caused by:
java.lang.NumberFormatException:

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at
org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at java.lang.Double.parseDouble(Double.java:318)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at tech.androidstudio.xmlpullparserdemo.MyHandler.characters(MyHandler.java:76)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatParser.text(ExpatParser.java:165)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:518)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:479)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at tech.androidstudio.xmlpullparserdemo.MainActivity.saxGetList(MainActivity.java:146)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at tech.androidstudio.xmlpullparserdemo.MainActivity.onCreate(MainActivity.java:43)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.access$1500(ActivityThread.java:117)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.os.Looper.loop(Looper.java:123)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:3683)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:507)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

03-18 07:46:41.328 27102-27102/tech.androidstudio.xmlpullparserdemo E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)

原因分析:

一开始我以为是我转换时候的错误,后来发现其实是我的全局变量在endElement 里面没有设置为空,的原因,当读完了endElement 以后,它继续读取后面的内容,

例如下面的信息,例如下面的</money>的节点后面就有换行符号,下一行读取到</worker>之前还有Tab的符号。所以读取的Tab
信息会覆盖原来的4000的这个信息.所以再赋值的时候 就是将一个Tab的信息复制给Double 的了,所以报错了。

<workers>
<worker id="AQ01">
<name>Mark</name>
<sex>男</sex>
<status>经理</status>
<address>北京</address>
<money>4000</money>
</worker>


解决办法:

在endElement 里面将全局变量设置为空。

全部代码如下:

package tech.androidstudio.xmlpullparserdemo;

import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Kodulf on 2016/3/18.
*/
public class MyHandler extends DefaultHandler {
List<Worker> mList;
Worker mWorker;
String mQualifiedName;
/**
<worker id="AQ01">
<name>Mark</name>
<sex>男</sex>
<status>经理</status>
<address>北京</address>
<money>4000</money>
</worker>
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
Log.d("Kodulf", "SAX start Document");
//在 startDocument 里面初始化List
mList = new ArrayList<Worker>();
}

//这里的 qName-》qualified name 限定名 ,这个 参数要设置为成员变量,因为下面的characters里面需要用到。
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
mQualifiedName=qName;
//如果startElement是worker的话,<worker id="AQ01">,要获取属性id的 值
if("worker".equals(qName)){
mWorker = new Worker();
int length = attributes.getLength();
for (int i = 0; i < length; i++) {
String attributeName = attributes.getQName(i);
if("id".equals(attributeName)){
String attributeValue = attributes.getValue(i);
mWorker.setId(attributeValue);
}
}
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
/**
<name>Mark</name>
<sex>男</sex>
<status>经理</status>
<address>北京</address>
<money>4000</money>
*/
super.characters(ch, start, length);
String nodeValue = new String(ch,start,length);
if("name".equals(mQualifiedName)){
mWorker.setName(nodeValue);
}else if("sex".equals(mQualifiedName)){
mWorker.setSex(nodeValue);
}else if("status".equals(mQualifiedName)){
mWorker.setStatus(nodeValue);
}else if("address".equals(mQualifiedName)){
mWorker.setAddress(nodeValue);
}else if("money".equals(mQualifiedName)){
//注意这里的Money 是double 类型的,所以要转换一下
mWorker.setMoney(Double.parseDouble(nodeValue));
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
//TODO 一定要将全局变量mQualifiedName 设置为空,//例如下面的</money>的节点后面就有换行符号,下一行读取到</worker>之前还有Tab的符号。
// 所以读取的Tab 信息会覆盖原来的4000的这个信息.所以再赋值的时候 就是将一个Tab的信息复制给Double 的了,所以报错了。
mQualifiedName=null;
//判断是否是worker,如果是的话,就将mWorker 添加到list 里面去
if("worker".equals(qName)){
mList.add(mWorker);
}
}

@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.d("Kodulf", "SAX end Document");
}

public List<Worker> getmList(){
return mList;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: