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

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;
        //如果startElementworker的话,<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;
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值