开发者社区> 问答> 正文

android 手机端从服务器端读取数据库的文件,抛出异常::报错

程序源代码:

private void updateMenu(){
String urlStr = HttpUtil.BASE_URL + "servelet/UpdataServelet";
HttpURLConnection 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 =  (HttpURLConnection) url.openConnection();
	conn.setRequestMethod("GET");
	conn.connect();
	}catch (Exception e1) { 
	System.out.println("e1.toString()"+e1.toString());
	}	
			
	try { 
	in = conn.getInputStream();
	}catch (Exception e2) { 
	System.out.println("e2.toString()"+e2.toString());
	}

			
	try { 
	factory = DocumentBuilderFactory.newInstance();	
	builder = factory.newDocumentBuilder();
	doc = builder.parse(in);
	nl = doc.getElementsByTagName("menu");
	cr = getContentResolver();
	uri1 = Uri.parse  ("content://com.wang.domtest02.myprovider/menu1");
	cr.delete(uri1, null, null);  

	// 循环将数据保存到菜谱表
	for (int i = 0; i < nl.getLength(); i++) {
					
		ContentValues values = new ContentValues();
		int id = Integer.parseInt(doc.getElementsByTagName("id").item(i).getFirstChild().getNodeValue());
		String name = doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue();
												
	// 添加到ContenValues对象
	values.put("_id", id);
	values.put("name", name);
	  
	// 插入到数据库
	cr.insert(uri1, values);
	in.close();
	}
	}catch (Exception e3) { 
	System.out.println("e3.toString()"+e3.toString());
	}
		
	}

 

 

异常如下:

10-16 17:09:50.155: I/System.out(22977): e2.toString()java.io.FileNotFoundException: http://111.186.100.77:8080/Wireless_Serverservelet/UpdataServelet

10-16 17:09:50.155: I/System.out(22977): e3.toString()java.lang.IllegalArgumentException: InputStream cannot be null

谁能帮我看看问题出在哪?为什么会报这样的异常,我的服务器端TOMCAT和数据库已经绑定在一起,数据库里是有数据的。到底是什么原因呢?

 

展开
收起
kun坤 2020-06-07 14:36:42 866 0
1 条回答
写回答
取消 提交回答
  • 引用来自“hanzhankang”的答案

    那地址是:http://111.186.100.77:8080/Wireless_Server/servelet/Updateservelet

    不过http://111.186.100.77:8080 

    你这个像是外网地址,你确定正确能访问?

    我把从网络读取的数据流转化字符串,用的方法是:

    int b;
    StringBuffer sb = new StringBuffer();
    while((b = in.read())!=-1 ){
    sb.append((char)b);
    }
    System.out.println(sb);

    打印出来:

    10-20 10:47:26.079: I/System.out(32577): <?xml version="1.0" encoding="utf-8"?>
    10-20 10:47:26.079: I/System.out(995): <menulist>
    10-20 10:47:26.079: I/System.out(995): <>
    10-20 10:47:26.079: I/System.out(995): <menu>
    10-20 10:47:26.089: I/System.out(995): <id>1</id>
    10-20 10:47:26.089: I/System.out(995): <name>宫保鸡丁</name>
    10-20 10:47:26.089: I/System.out(995): </menu>
    10-20 10:47:26.089: I/System.out(995): <menu>
    10-20 10:47:26.089: I/System.out(995): <id>2</id>
    10-20 10:47:26.089: I/System.out(995): <name>香辣土豆丝</name>
    10-20 10:47:26.089: I/System.out(995): </menu>
    10-20 10:47:26.089: I/System.out(995): <menu>
    10-20 10:47:26.089: I/System.out(995): <id>3</id>
    10-20 10:47:26.089: I/System.out(995): <name>炒虾仁</name>
    10-20 10:47:26.089: I/System.out(995): </menu>
    10-20 10:47:26.089: I/System.out(995): <menu>
    10-20 10:47:26.089: I/System.out(995): <id>4</id>
    10-20 10:47:26.089: I/System.out(995): <name>剁椒金龙鱼</name>
    10-20 10:47:26.099: I/System.out(995): </menu>
    10-20 10:47:26.099: I/System.out(995): <menu>
    10-20 10:47:26.099: I/System.out(995): <id>5</id>
    10-20 10:47:26.099: I/System.out(995): <name>红烧肉</name>
    10-20 10:47:26.099: I/System.out(995): </menu>
    10-20 10:47:26.099: I/System.out(995): <menu>
    10-20 10:47:26.099: I/System.out(995): <id>6</id>
    10-20 10:47:26.099: I/System.out(995): <name>晋阳一品肘</name>
    10-20 10:47:26.099: I/System.out(995): </menu>
    10-20 10:47:26.099: I/System.out(995): </menulist>

    这就证明读取到了网络的xml,但是解析的时候出来问题。

    接着我在本地的assets文件夹里写了一个xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <menulist>
    <menu>
        <id>1</id>
        <name>张三</name> 
    </menu>
    <menu>
        <id>2</id>
        <name>李四</name> 
    </menu>
    <menu>
        <id>3</id>
        <name>王五</name>
      </menu>
    <menu>
        <id>4</id>
        <name>高小小</name>
    </menu>
    <menu>
        <id>5</id>
        <name>李大大</name>
     </menu>
    <menu>
        <id>6</id>
        <name>郭剩剩</name> 
    </menu>
    </menulist>

    用同样的解析方法,可以解析出来,并且保存到SQLite数据表中。

    这样看来是不是因为网络读取的xml文件格式有问题,所以导致的解析错误呢?

    因为网络的xml是根据服务器的数据库文件自动生成的,所以到底该怎么弄呢?我没思路了又

    ######回复 @hanzhankang : 最后发现就是空尖括号的错误,多谢多谢啦!!######回复 @skywxx : 估计是编码问题了,那个应该也不影响,判断一个xml文件正确的方法是用浏览器能不能正确打开不报错。 编码问题比较好解决,可以通过设置 过滤器 或者在读取的时候、放送的时候设置,这方面的资料网上很多的。######回复 @hanzhankang : 我也不知道为什么有<>因为服务器端的xml文件是根据数据库中表里的数据产生的,<>怎么产生的我也很纳闷。编码问题?应该是在数据库端的响应中设置,是吧?######估计是你的编码有问题,系统无法解析,就出现异常了吧、######首先你要把获取来的内容输出(记得统一编码格式),再根据内容解析出来数据。你要确保输出的内容符合xml编码规范。第三行为啥还有个“<>”?我看错了?######你先用浏览器看看能不能访问: http://111.186.100.77:8080/Wireless_Serverservelet/UpdataServelet######可以访问,说明,不会出现获取服务器数据被封的情况吧?######是可以访问的######

    String urlStr = HttpUtil.BASE_URL + "servelet/UpdataServelet";



    比起来,是不是多了个“servelet/”???

    ######我定义的 BASE_URL 是:public static final String BASE_URL = "http://111.186.100.77:8080/Wireless_Server",然后加上后边的servelet/Updateservelet######

    http://111.186.100.77:8080/Wireless_Server/Updateservelet

    是你想访问的地址还是

    http://111.186.100.77:8080/Wireless_Server/servelet/Updateservelet



    ######你最后把访问的 全网站打印出来,便于分析。######回复 @skywxx : 这个不是看你在哪个文件夹下的,而是看你在web.xml文件件下的配置,你把配置贴出来看看。######我改成http://111.186.100.77:8080/Wireless_Server/Updateservelet,还是报相同的错误.Updateservelet.java是在Servelet文件夹下的,所以我前边加了一个Servelet######

    引用来自“hanzhankang”的答案

    http://111.186.100.77:8080/Wireless_Server/Updateservelet

    是你想访问的地址还是

    http://111.186.100.77:8080/Wireless_Server/servelet/Updateservelet



    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
        <servlet>
    	<servlet-name>LoginServlet</servlet-name>
    	<servlet-class>com.wang.servlet.LoginServlet</servlet-class>
        </servlet>
    	
        <servlet>
    	 <servlet-name>PayMoneyServlet</servlet-name>
    	 <servlet-class>com.wang.servlet.PayMoneyServlet</servlet-class>
       </servlet>
    
        <servlet>
        	<servlet-name>PayServlet</servlet-name>
        	<servlet-class>com.wang.servlet.PayServlet</servlet-class>
        </servlet>
    
        <servlet>
        	<servlet-name>UpdateServlet</servlet-name>
        	<servlet-class>com.wang.servlet.UpdateServlet</servlet-class>
        </servlet>
      
    
    
        <servlet-mapping>
    	<servlet-name>LoginServlet</servlet-name>
    	<url-pattern>/servlet/LoginServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
        	<servlet-name>PayMoneyServlet</servlet-name>
        	<url-pattern>/servlet/PayMoneyServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
        	<servlet-name>PayServlet</servlet-name>
        	<url-pattern>/servlet/PayServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
        	<servlet-name>UpdateServlet</servlet-name>
        	<url-pattern>/servlet/UpdateServlet</url-pattern>
        </servlet-mapping>
    
    
    	<filter>
    		<filter-name>EF</filter-name>
    		<filter-class>com.wang.filter.EncodingFilter</filter-class>
    	</filter>
    
    	<filter-mapping>
    		<filter-name>EF</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    </web-app>
    
    web.xml是这样的,昨天整程序整的晕得连汉语意思都看不懂了,你看看我这里边UpdateServlet
    ######

    那地址是:http://111.186.100.77:8080/Wireless_Server/servelet/Updateservelet

    不过http://111.186.100.77:8080 

    你这个像是外网地址,你确定正确能访问?

    ######回复 @hanzhankang : 今天我换了一个思路,现在本地文件夹assets中写了一个xml,然后解析这个,程序是可以正常运行的,这就证明解析方法没错。那怎样看一下是不是读取过来数据 呢?######回复 @skywxx : 既然获取了数据,你就好好解析结果,dom,sax都无所谓的,网上也有代码,很好找的!xml,json数据格式最好都尝试一下,这些都是很实用的!######回复 @hanzhankang : 我try/catch异常,现在报了这个异常,好像是SAX解析的异常,但是我用的是DOM解析啊,这是什么原因呢?org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@411cce48)######回复 @skywxx : 我想你做了这个例子就知道原理是什么了,你的方法已经很好了,其他的方法也是对原始方法的封装!######关于android 手机端与服务器端数据传递的各种形式,你是怎么学习的啊?有没有好书推荐?
    2020-06-07 14:36:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载