在 Java 中使用 SAX 解析器的堆栈溢出错误

Posted

技术标签:

【中文标题】在 Java 中使用 SAX 解析器的堆栈溢出错误【英文标题】:Stack Overflow Error Using SAX Parser in Java 【发布时间】:2011-09-26 03:10:27 【问题描述】:

所以我和一个朋友正在做这个项目,我们一直在试图弄清楚如何从 XML 文件中的单个文本节点中提取值。他能够想出一些代码来提取我们正在寻找的文本节点,但是有一个小问题。当我运行以下代码时,它可以正常工作并提取我们需要的内容...

JAVA 代码

import java.io.File;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Test extends DefaultHandler 

    StringBuffer buffer;
    String heading;
    boolean inHeading;

    public static void main(String[] args)
    
        try
        
            Test saxNames = new Test();
            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

            parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames);

        
        catch(Exception e)
        
            e.printStackTrace(System.err);
        
    

    public void startElement(String uri, String localName, String qName, Attributes attrs)
    
        if ("w:pStyle".equals(qName))
        
            String val = attrs.getValue("w:val");

            if (val.contains("Heading"))
            
                if (isHeading(val))
                
                    System.out.println(val);
                    inHeading = true;
                
            
        



        if("w:t".equals(qName))
        
            String val = attrs.getValue("w:t");
            if (inHeading == true)
            
                buffer = new StringBuffer();
            
         
    

    public void characters(char buff[], int offset, int length) throws SAXException
    
        String s = new String(buff, offset, length);

        if(buffer != null)
        
            buffer.append(s);
            heading = heading += s;
           
    

    public void endElement(String uri, String localName, String qName)
    
        buffer = null; 

        if ("w:p".equals(qName) && inHeading == true)
               
            System.out.println(heading);        

            heading = "";
            inHeading = false;      
           
    

    private static boolean isHeading(String heading)
    
        String headingNumber = heading.substring(7,8);
        String headingName = heading.substring(0,7);

        if (headingName.equals("Heading"))
        
            if (headingNumber.equals("1") 
                    || headingNumber.equals("2")
                    || headingNumber.equals("3")
                    || headingNumber.equals("4")
                    || headingNumber.equals("5")
                    || headingNumber.equals("6"))
            
                return true;
            
        

        return false; 
    

但是,由于这只是我们正在进行的更大项目的一部分,我希望能够将其合并到驱动程序类中。因此我希望能够将这里的 main 方法变成一个构造函数,所以当我改变时......

public static void main(String[] args)
        
            try
            
                Test saxNames = new Test();
                SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

                parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames);

            
            catch(Exception e)
            
                e.printStackTrace(System.err);
            
        

到....

public Test()
        
            try
            
                Test saxNames = new Test();
                SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

                parser.parse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne.docx - Extracted Items/word/document.xml"), saxNames);

            
            catch(Exception e)
            
                e.printStackTrace(System.err);
            
        

当我尝试从我的驱动程序运行它时,我收到以下错误....

Exception in thread "main" java.lang.***Error
    at Test.<init>(Test.java:17)
    at Test.<init>(Test.java:17)
    at Test.<init>(Test.java:17)
    at Test.<init>(Test.java:17)
    at Test.<init>(Test.java:17)
        .
        .
        .
    at Test.<init>(Test.java:17)

我不知道它为什么这样做。查看代码,我想我可能知道错误来自哪里。在构造函数中,它用相同的名称实例化另一个构造函数 ---> 因此它在 main 方法中起作用。但是,我不确定如何解决这个问题?

【问题讨论】:

+1,仅用于标题 :) 【参考方案1】:

每次创建 Test 实例时,都会创建一个新的 Test 实例。看到错误了吗?

改为在您的 try 语句中执行此操作:

// DON'T DO THIS: Test saxNames = new Test();

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

parser.parse(new File("blabla_filename.xml"), this);

【讨论】:

【参考方案2】:

在你的构造函数中,你正在调用你的构造函数......

公共 Test() 尝试 测试 saxNames = new Test(); ...

【讨论】:

哈哈在你发布之前就意识到了这一点:D 因此为什么它主要工作(可以理解)......但我到底需要在这里改变什么才能使构造函数工作?

以上是关于在 Java 中使用 SAX 解析器的堆栈溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

android中XML SAX解析器、Pull解析器和DOM解析器的区别

Java分治算法堆栈溢出错误

在BlackBerry中使用SAX解析器解析XML

Java堆栈溢出的机制与原理

尝试在java中使用正则表达式时堆栈溢出

Java 中的自调用函数中的堆栈溢出错误(岛数)