2013-05-09 22 views
1

我有一个将xml字符串转换为列表数组的函数。在达到最后一个条件时,它跳转到函数的最后一个返回。for循环里面try catch返回不执行下一行

该代码不执行for循环后的return语句,并且它在for循环后不执行任何行。它只是执行最后的return语句。

功能如下所示

public List<List<String>> UpdateOrderDetailsTable(String xml) { 
     List<List<String>> ll = new ArrayList<List<String>>(); 
     try { 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
        .newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8")); 
      Document doc = dBuilder.parse(is); 
      doc.getDocumentElement().normalize(); 

      NodeList nList = doc.getElementsByTagName("ProductDetails"); 
      Log.i("1111",Integer.toString(nList.getLength())); 
      if (nList.getLength() > 0) { 


       // get all order details 
          //i=1 for neglect first tag 
       for (int i = 1; i < nList.getLength(); i++) { 

        Node nNode = nList.item(i); 


        if (nNode.getNodeType() == Node.ELEMENT_NODE) { 

         Element eElement = (Element) nNode; 
          List<String> l = new ArrayList<String>(); 
          l.add(0, eElement.getElementsByTagName("OrderId").item(0).getTextContent()); 
          l.add(1, eElement.getElementsByTagName("ProductId").item(0).getTextContent()); 
          l.add(2, eElement.getElementsByTagName("ProductName").item(0).getTextContent()); 
          l.add(3, eElement.getElementsByTagName("Model").item(0).getTextContent()); 
          l.add(4, eElement.getElementsByTagName("Quantity").item(0).getTextContent()); 
          ll.add(l); 

          Log.i(Integer.toString(i),eElement.getElementsByTagName("OrderId").item(0).getTextContent()); 

        } 

       } 

       return ll; 
      } 
      Log.i("2222222222222222222","222222222222222222"); 
     } catch (Exception e) { 
      Log.e("11111", e.toString()); 
     } 
     return null; 

    } 

this is my xml

+0

这意味着异常在'for'循环被抛出!调试你的代码,找出哪一行抛出异常! – SudoRahul 2013-05-09 05:59:57

+0

你在日志中看到什么? – BevynQ 2013-05-09 06:01:01

+0

是你的logcat打印任何异常 – Gunaseelan 2013-05-09 06:01:06

回答

0

使用i=0操作

// get all order details 
       for (int i = 0; i < nList.getLength(); i++) { 
} 

} 
+1

如果nList中只有一个元素,那么它将会是ArrayIndexOutOfBoundException – umesh 2013-05-09 06:05:39

+0

@umesh:如果nList包含1个元素,那么'nList.getLength()'得到'1'而不是'0'.'length'从1开始,索引从'0'开始。 – Shailesh 2013-05-09 06:12:58

+0

ok然后在该行中Node nNode = nList.item(i);,你将尝试访问索引1处的元素,这是不可用 – umesh 2013-05-09 06:15:57

0

从你的代码,可以推断的是,只有情况下,它不会执行后的任何陈述循环是你正在得到一些EXCETPION。根据你的意见,你说你没有在日志中看到任何异常。然后我怀疑你的记录器,为了测试的目的,试着放一些Sysout语句来确保记录器是正确的。你的log.e()方法可能工作不正常,试着把你的log.i()放入异常块并看看。

+0

正确,他得到任何异常,为什么他不发布logcat输出 – umesh 2013-05-09 06:18:20

+0

我敢肯定。我alrdy把catch.txt中的一个断点,如果我手动将一个nullpointer它catch.so没有问题的记录器和catch.Then y ??? – kannan 2013-05-09 06:24:14

+0

@umesh日志猫只显示for循环内的日志。我调查了过去8小时 – kannan 2013-05-09 06:25:38

0

如果你不想第一个项目,然后更改if (nList.getLength() > 0)声明if (nList.getLength() > 1)

也把一个else语句if (nNode.getNodeType() == Node.ELEMENT_NODE)并把日志输出。例如: -

if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
    Element eElement = (Element) nNode; 
    List<String> l = new ArrayList<String>(); 
    l.add(0, eElement.getElementsByTagName("OrderId").item(0).getTextContent()); 
    l.add(1, eElement.getElementsByTagName("ProductId").item(0).getTextContent()); 
    l.add(2, eElement.getElementsByTagName("ProductName").item(0).getTextContent()); 
    l.add(3, eElement.getElementsByTagName("Model").item(0).getTextContent()); 
    l.add(4, eElement.getElementsByTagName("Quantity").item(0).getTextContent()); 
    ll.add(l); 
    Log.i(Integer.toString(i), eElement.getElementsByTagName("OrderId").item(0).getTextContent()); 
} else { 
    Log.wtf("1111", "Item " + i + "is not Node.ELEMENT_NODE type"); 
} 

这简直是不关你的节点是类型ELEMENT_NODE

+0

代码不会触及else语句 – kannan 2013-05-15 04:57:42

0
public static ArrayList<ProductDetails> parserData(String data) { 
    XmlPullParserFactory factory = null; 
    XmlPullParser parser = null; 
    ArrayList<ProductDetails> productDetailsList = new ArrayList<ProductDetails>(); 
    ProductDetails productDetails = null; 
    data = data.replaceAll("&", "&amp;"); 
    data = data.replaceAll("<BR />", ""); 

    try { 
     factory = XmlPullParserFactory.newInstance(); 
     parser = factory.newPullParser(); 
     parser.setInput(new StringReader(data)); 

     int eventType = parser.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      if (eventType == XmlPullParser.START_TAG) { 
       if ("ProductDetails".equals(parser.getName())) { 
        productDetails = new ProductDetails(); 
       } else if ("OrderId".equals(parser.getName())) { 
        productDetails.setOrderId(Integer.parseInt(parser.nextText())); 
       } else if ("ProductId".equals(parser.getName())) { 
        productDetails.setProductId(Integer.parseInt(parser.nextText())); 
       } else if ("ProductName".equals(parser.getName())) { 
        productDetails.setProductName(parser.nextText()); 
       } else if ("Model".equals(parser.getName())) { 
        productDetails.setModel(parser.nextText()); 
       } else if ("Quantity".equals(parser.getName())) { 
        productDetails.setQuantity(Integer.parseInt(parser.nextText())); 
       } 
      } else if (eventType == XmlPullParser.END_TAG) { 
       if ("ProductDetails".equals(parser.getName())) { 
        productDetailsList.add(productDetails); 
       } 
      } 
      eventType = parser.next(); 
     } 
     System.out.println(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return productDetailsList; 
}