开发者社区> 问答> 正文

关于从服务器端数据库读取数据并保存:报错

@程序員 你好,想跟你请教个问题:

 

// 更新本地数据库
private void updateTable1() {   
String urlStr = HttpUtil.BASE_URL + "servlet/UpdateServlet";
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(in);
NodeList nl = doc.getElementsByTagName("menu");
ContentResolver cr = getContentResolver();
Uri uri1 = Menus.CONTENT_URI;
cr.delete(uri1, null, null);
for (int i = 0; i < nl.getLength(); i++) {
ContentValues values = new ContentValues();
// 解析XML文件获得菜单id
int id = Integer.parseInt(doc.getElementsByTagName("id").item(i).getFirstChild().getNodeValue());
// 名称
String name = doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue();
// 图片路径
String pic = doc.getElementsByTagName("pic").item(i).getFirstChild().getNodeValue();          
// 价格
int pri = Integer.parseInt(doc.getElementsByTagName("price").item(i).getFirstChild().getNodeValue());
// 添加到ContenValues对象
values.put("_id", id);
values.put("name", name);
values.put("pri", pri);
values.put("pic", pic);
// 插入到数据库
cr.insert(uri1, values);
in.close();
    }
Toast.makeText(UpdateActivity.this, "执行了try", Toast.LENGTH_LONG).show();//运行程序后未显示
    } catch (Exception e) {
    e.printStackTrace();
System.out.println("e.toString()--->>>"+e.toString());
Toast.makeText(UpdateActivity.this, "执行了catch", Toast.LENGTH_LONG).show();//运行程序后显示
    }
    }
}

运行程序打印出:

e.toString()--->>>org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@405a8878) 并且屏幕显示“执行了catch”,想请教一下,这是什么原因造成的?

展开
收起
kun坤 2020-06-07 00:22:23 604 0
1 条回答
写回答
取消 提交回答
  • 獲取的數據的格式沒問題么######没有问题,服务器端和本地数据库的字段都是一样的,关键是我用的是dom解析,而打印e.toString(),确实SAX解析错误,这一点很纠结啊?另外我想减小try块,但是总会出现错误######另外碰見這種情況debug調試撒,這樣解決問題就簡單多了######

    引用来自“程序員”的答案

    獲取的數據的格式沒問題么

    您看一下,在conn处提示有错误,请问怎样减小TRY块才不会出来这种错误啊?

    ######

    剛開了個會

    這種情況 解析的文件格式不對是會報這個錯誤的

    。。。。。把 URLConnection conn  = null ;放到上面

     然後在Try 裡面 conn = url.openConnection() 就不會有問題了

     

    ######我又试try/catch了几个语句,最后发现是doc = builder.parse(in);这一句导致的异常org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@405a8718),您能分析出来设施什么原因导致的吗?######

    引用来自“程序員”的答案

    剛開了個會

    這種情況 解析的文件格式不對是會報這個錯誤的

    。。。。。把 URLConnection conn  = null ;放到上面

     然後在Try 裡面 conn = url.openConnection() 就不會有問題了

     

    // 更新本地数据库
    private void updateTable1() {   
    String urlStr = HttpUtil.BASE_URL + "servlet/UpdateServlet";
    URLConnection conn  = null ;
    InputStream in = null;
    DocumentBuilderFactory factory = null;
    DocumentBuilder builder = null;
    Document doc = null;
    Uri uri1 = null;
    ContentResolver cr = null;
    NodeList nl = null;
    
    try {
    URL url = new URL(urlStr);
    conn = url.openConnection();
    in = conn.getInputStream();
    factory = DocumentBuilderFactory.newInstance();
    builder = factory.newDocumentBuilder();
    doc = builder.parse(in);
    }catch (Exception e1) { 
    System.out.println("e1.toString()"+e1.toString());
    }
    
    
    try { //我逐步减小这个try块的大小,这种状态下打印出如下两种语句
    nl = doc.getElementsByTagName("menu");
    cr = getContentResolver();
    Uri uri1 = Menus.CONTENT_URI;
    cr.delete(uri1, null, null);
    for (int i = 0; i < nl.getLength(); i++) {
    ContentValues values = new ContentValues();
    // 解析XML文件获得菜单id
    int id = Integer.parseInt(doc.getElementsByTagName("id").item(i).getFirstChild().getNodeValue());
    // 名称
    String name = doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue();
    // 图片路径
    String pic = doc.getElementsByTagName("pic").item(i).getFirstChild().getNodeValue();          
    // 价格
    int pri = Integer.parseInt(doc.getElementsByTagName("price").item(i).getFirstChild().getNodeValue());
    // 添加到ContenValues对象
    values.put("_id", id);
    values.put("name", name);
    values.put("pri", pri);
    values.put("pic", pic);
    // 插入到数据库
    cr.insert(uri1, values);
    in.close();
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
        }
    }

    09-21 14:36:03.390: I/System.out(2610): e1.toString()org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@405a2f28)
    09-21 14:36:03.390: I/System.out(2610): e2.toString()java.lang.NullPointerException,也就是说明执行的都是catch。
    在try块从in = conn.getInputStream();位置下移到doc = builder.parse(in);
    时,打印的都是I/System.out(2506): e2.toString()org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@405a8558)

    这能说明什么问题吗?从这里可以分析出来是什么原因吗?

    ######後面的bug都是前面引起的,明顯一開始“ doc = builder.parse(in); ”的時候就有問題,######谢谢你啊,我在查查
    2020-06-07 00:22:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS块储存产品全面解析 立即下载