本帖最后由 cnicc 于 2010-02-05 11:27:44 编辑

解决方案 »

  1.   

    自己解决了,贴一段解决方案
    ====================================
    当作为一个org.w3c.dom文档被解析到内存中时,firstname元素有一个是TEXT_NODE类型的子节点。程序员也许会被引导使用以下的Java代码来获得firstname字符串。
    // where fnE is the firstname org.w3c.dom.Element reference
     String name = fnE.getFirstChild().getNodeValue();
           使用类似的代码来设置firstname的新值。
      fnE.getFirstChild().setNodeValue( newfirstname );
          这段代码将会被编译并看起来能正确的工作,直到有一天由于某种原因一个空字符串被负值给了这个文本节点。当该文本仍然在内存中时,上面的代码将会继续工作。但是当该文档被一个转换器序列化为一个文档的时候,被序列化的并不是所期望的文档: 
      < firstname>< /firstname>
          实际上你能得到的是:
      < firstname/>
          转换器意识到firstname元素为空,并考虑了这种首选的形式。现在当这个校订的文档再次被解析进入内存的时候,那个firstname元素就不再含有一个子节点,并且下面这个语句——
      String f = fnE.getFirstChild().getNodeValue();
          ——只会给程序员一个令人厌恶的打击,导致一个NullPointerException异常
         解决的办法当然就是防御性的进行编码,确认子节点的 存在并证明它的默认值不存在。例如,使用下面的代码来获得firstname。
     // where fnE is the firstname org.w3c.dom.Element reference
      Node fnNode = fnE.getFirstChild();
      if( fnNode == null ){  name= "" ;
      } else { name = fnNode.getNodeValue();
      } 
      

  2.   

    如果你用比较新的XML解析器,那么可以用node.getTextContent()来返回里面的值,不需要再这样处理不过旧版本的解析器不支持这个方法的。
      

  3.   

    感觉用if 和else 就能解决的问题啊;如果是空的话,
    if("".equals(str)){}else{
      str.tirm();
    }
    注意: if 中建议“”.equal() 这样写,用空和对比 str ,而不用str 里对比空,这样可以避免 一些问题。