短信备份BUG(空指针异常)调试

说明:短信备份的序列化时候有时出现空指针异常

ps:由于在手机上搞过短信备份与恢复(恢复时没有情况),所以同样的短信都是两条,不要在意这些细节。

serializer.startTag(null, "sms");
serializer.startTag(null, "address");
String address = cursor.getString(0);
 
serializer.endTag(null, "address");

上次毕业设计的时候把短信箱清空,又能正常运行了,怀疑短信数据库中有可能出现了问题,导出短信数据库一看究竟。

短信备份BUG(空指针异常)调试 

短信备份BUG(空指针异常)调试

短信备份BUG(空指针异常)调试

通过观察数据库和对比log日志发现:

出现错误的地方为一条草稿短信,该短信没有写姓名即address,所以在序列化的时候java.lang.NullPointerException

解决方法:

serializer.text(address+"");//解决空指针异常

短信备份工具类源码如下:


package com.itheima.mobilesafe.utils;

import java.io.File;
import java.io.FileOutputStream;

import org.xmlpull.v1.XmlSerializer;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Xml;

public class SmsTools {
	
    //定义一个接口 。 暴露一些回调函数。
	
    public interface BackUpCallBack{
        /**
	 * 当短信备份前调用的方法
	 * @param total  总的短信个数
	 */
	public void beforeSmsBackup(int total);
		
	/**
	 * 短信备份中调用的方法 
	 * @param progress 当前备份的进度。
	 */
	public void onSmsBackup(int progress);
    }
	
	
    /**
     * 备份短信
     * @param context 上下文
     * @param path 短信备份后文件的路径
     * @param pb 进度条
     * @param pd 进度条对话框
     * 
     */
    public static void backup(Context context,String path,BackUpCallBack backupCallback) throws Exception{
	XmlSerializer serializer = Xml.newSerializer();//得到XML的序列化器
	
	//指定序列化器的参数
	File file = new File(path);
	FileOutputStream fos = new FileOutputStream(file);
	serializer.setOutput(fos, "utf-8");//设定保存位置和编码
	serializer.startDocument("UTF-8", true);//指定头\独立XML文件
	serializer.startTag(null, "smss");//开头节点
	ContentResolver resolver = context.getContentResolver();
	Uri uri = Uri.parse("content://sms/");
	Cursor cursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
	backupCallback.beforeSmsBackup(cursor.getCount());
	int progress = 0;
	while(cursor.moveToNext()){
	    serializer.startTag(null, "sms");
	    serializer.startTag(null, "address");
	    String address = cursor.getString(0);
	    serializer.text(address+"");//解决空指针异常 
	    serializer.text(address);
	    serializer.endTag(null, "address");
			
	    serializer.startTag(null, "date");
	    String date = cursor.getString(1);
	    serializer.text(date);
	    serializer.endTag(null, "date");
			
	    serializer.startTag(null, "type");
	    String type = cursor.getString(2);
	    serializer.text(type);
	    serializer.endTag(null, "type");
			
	    serializer.startTag(null, "body");
	    String body = cursor.getString(3);
	    serializer.text(body);
	    serializer.endTag(null, "body");
			
	    System.out.println("发件人:"+address+"\t信息:"+body);
	    serializer.endTag(null, "sms");
	    progress++;
	    backupCallback.onSmsBackup(progress);
	}
	cursor.close();
	serializer.endTag(null, "smss");
	serializer.endDocument();
	fos.close();
    }
}