Java 默认处理程序上的存储错误

Java 默认处理程序上的存储错误,java,xml,swing,parsing,Java,Xml,Swing,Parsing,我必须将sax解析器中的数据存储在数组中,但它显示的是空实数值,最后它显示的是数组越界的异常。如何在数组中添加所有数据类型,如名称属性vtype和值 import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JFrame; import org.xml.sax.Attribute

我必须将sax解析器中的数据存储在数组中,但它显示的是空实数值,最后它显示的是数组越界的异常。如何在数组中添加所有数据类型,如名称属性vtype和值

import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;  
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import org.xml.sax.Attributes; 
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class JTabbedPaneDemo extends JPanel {

     /*static String[] nameatt= {" sv_machineData "," Mould_data "," Core_1 "," Core_2 "};*/


    public JTabbedPaneDemo() {
    //  ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG");

        JTabbedPane jtbExample = new JTabbedPane();

        // Create First Tab.
        JPanel jplInnerPanel1 = createInnerPanel();
        jtbExample.addTab(" Sv_Machine_Data ", jplInnerPanel1);
        jplInnerPanel1.setLayout(new BorderLayout());
        JTable table1 = new JTable(5,3);
        JScrollPane tableContainer = new JScrollPane(table1);
        jplInnerPanel1.add(tableContainer,BorderLayout.CENTER);

        //jtbExample.setSelectedIndex(0);

        // Create Second Tab.
        JPanel jplInnerPanel2 = createInnerPanel();
        jtbExample.addTab(" Mould_data ", jplInnerPanel2);
        jplInnerPanel2.setLayout(new BorderLayout());
        JTable table2 = new JTable(5,3);
        JScrollPane tableContainer1 = new JScrollPane(table2);
        jplInnerPanel2.add(tableContainer1,BorderLayout.CENTER);

        // Create Third Tab.
        JPanel jplInnerPanel3 = createInnerPanel();
        jtbExample.addTab(" Core_1 ", jplInnerPanel3);
        jplInnerPanel3.setLayout(new BorderLayout());
        JTable table3 = new JTable(5,3);
        JScrollPane tableContainer3 = new JScrollPane(table3);
        jplInnerPanel3.add(tableContainer3,BorderLayout.CENTER);

        // Create Fourth Tab.
        JPanel jplInnerPanel4 = createInnerPanel();
        jtbExample.addTab(" Core_2 ", jplInnerPanel4);
        jplInnerPanel4.setLayout(new BorderLayout());
        JTable table4 = new JTable(5,3);
        JScrollPane tableContainer4 = new JScrollPane(table4);
        jplInnerPanel4.add(tableContainer4,BorderLayout.CENTER);


        // Add the Tabbed Pane to this panel.
        setLayout(new GridLayout(1, 1));
        add(jtbExample);
    }


protected JPanel createInnerPanel() {
    JPanel jplPanel = new JPanel();
    JLabel jlbDisplay = new JLabel();
    jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
    jplPanel.setLayout(new GridLayout(1, 1));
    jplPanel.add(jlbDisplay);
    return jplPanel;
}
public static void main(String[] args) {

    final String[] vt= {};
    JFrame frame = new JFrame("TabbedPane Source Demo");
    frame.addWindowListener(new WindowAdapter() {

        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    /*final JTabbedPaneDemo xm = new JTabbedPaneDemo();*/

    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    String nameAttribute;

    public void startElement(String uri, String localName,String qName, Attributes attributes)
    throws SAXException {

        if (qName.equalsIgnoreCase("TYP")) {
            bfname = true;
            }

        nameAttribute = attributes.getValue("Name");

        if (qName.equalsIgnoreCase("VALUE")){
            blname = true;
            }
    }

    public void characters(char ch[], int start, int length)
    throws SAXException {

        if (bfname) {
            System.out.println("Type : "+ new String(ch, start, length));
            String vtype = new String(ch, start, length);
            String [] typ = new String[length] ;
            for(int i=0;i<=length;i++) {
            typ[i]+=vtype;
            System.out.println("Type is "+typ[i]);
            }

            /*System.out.println("value of vt" +vt[j]);*/
            /*xm.textArea.append(vtype+"\n");*/
            bfname = false;
            }

        if (nameAttribute != null && !nameAttribute.equals("")) {
            //System.out.println("Name : " + nameAttribute);
            /*vname+=nameAttribute+ ", " +"\n";
            xm.textArea_3.setText(vname);
            */}

        if (blname) {   
            String vvalue = new String(ch, start, length);
            //System.out.println("Value:" + Double.valueOf(vvalue));
            /*xm.textArea_1.append(Double.valueOf(vvalue)+"\n");*/
            blname = false;
            }
    }
    };

    saxParser.parse(new File("my xmllocal address.xml"), handler);

    }
    catch (Exception e) {
    e.printStackTrace();
    }
    frame.getContentPane().add(new JTabbedPaneDemo(),BorderLayout.CENTER);
    frame.setSize(400, 500);
    frame.setVisible(true);
}
import javax.swing.JScrollPane;
导入javax.swing.JTabbedPane;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JFrame;
导入org.xml.sax.Attributes;
导入javax.swing.JTable;
导入javax.swing.table.JTableHeader;
导入javax.xml.parsers.SAXParser;
导入javax.xml.parsers.SAXParserFactory;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
导入java.awt.*;
导入java.awt.event.*;
导入java.io.File;
公共类JTabbedPaneDemo扩展了JPanel{
/*静态字符串[]nameatt={“sv_machineData”、“mold_data”、“Core_1”、“Core_2”}*/
公共JTabbedPaneDemo(){
//ImageIcon=newImageIcon(“JavaSwingTutorial.JPG”);
JTabbedPane jtbExample=新JTabbedPane();
//创建第一个选项卡。
JPanel jplInnerPanel1=createInnerPanel();
jtbExample.addTab(“Sv_机器_数据”,jplInnerPanel1);
jplInnerPanel1.setLayout(新的BorderLayout());
JTable table 1=新的JTable(5,3);
JScrollPane tableContainer=新的JScrollPane(表1);
jplInnerPanel1.add(tableContainer,BorderLayout.CENTER);
//jtbExample.setSelectedIndex(0);
//创建第二个选项卡。
JPanel jplInnerPanel2=createInnerPanel();
jtbExample.addTab(“模具数据”,jplInnerPanel2);
setLayout(新的BorderLayout());
JTable table 2=新的JTable(5,3);
JScrollPane tableContainer1=新的JScrollPane(表2);
添加(tableContainer1,BorderLayout.CENTER);
//创建第三个选项卡。
JPanel jplInnerPanel3=createInnerPanel();
jtbExample.addTab(“核心1”,jplInnerPanel3);
setLayout(新的BorderLayout());
JTable table 3=新的JTable(5,3);
JScrollPane tableContainer3=新的JScrollPane(表3);
添加(tableContainer3,BorderLayout.CENTER);
//创建第四个选项卡。
JPanel jplInnerPanel4=createInnerPanel();
jtbExample.addTab(“核心2”,jplInnerPanel4);
jplInnerPanel4.setLayout(新的BorderLayout());
JTable table 4=新的JTable(5,3);
JScrollPane tableContainer4=新的JScrollPane(表4);
添加(tableContainer4,BorderLayout.CENTER);
//将选项卡式窗格添加到此面板。
setLayout(新的GridLayout(1,1));
添加(jtbe示例);
}
受保护的JPanel createInnerPanel(){
JPanel jplPanel=新的JPanel();
JLabel jlbDisplay=新的JLabel();
jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
setLayout(新的GridLayout(1,1));
jplPanel.add(jlbDisplay);
返回jplPanel;
}
公共静态void main(字符串[]args){
最后一个字符串[]vt={};
JFrame=newjframe(“TabbedPane源代码演示”);
frame.addWindowListener(新的WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
});
/*最终JTabbedPaneDemo xm=新JTabbedPaneDemo()*/
试一试{
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=factory.newSAXParser();
DefaultHandler=新的DefaultHandler(){
布尔bfname=false;
布尔blname=false;
字符串名称属性;
public void startElement(字符串uri、字符串localName、字符串qName、属性)
抛出SAX异常{
if(qName.equalsIgnoreCase(“典型”)){
bfname=true;
}
nameAttribute=attributes.getValue(“名称”);
if(qName.equalsIgnoreCase(“值”)){
blname=true;
}
}
公共无效字符(字符ch[],整数开始,整数长度)
抛出SAX异常{
if(bfname){
System.out.println(“类型:”+新字符串(ch,start,length));
字符串vtype=新字符串(ch、开始、长度);
字符串[]类型=新字符串[长度];
对于(int i=0;i这就是问题所在:

 for(int i=0;i<=length;i++) {
     typ[i]+=vtype;
     System.out.println("Type is "+typ[i]);
 }
…但这似乎毫无意义。我认为没有理由首先创建字符串数组

如果您需要数组中的所有类型,则需要在
characters
方法之外创建该数组(或理想情况下创建一个列表)…为每段文本调用
characters
方法。您需要将列表创建为持续状态,然后只需在
characters
方法中添加到列表中即可


除非这真的是一个巨大的文件,否则我个人会从SAX开始——虽然它对于读取一次巨大的文件非常强大,但与将整个文件加载到某种DOM表示(可能是第三方XML库,如JDOM)相比,这是一个痛苦的工作.

不知道,为了获得更好的帮助,请尽快发布一个简短、可编译的文件,谢谢您的帮助。实际上,我必须将所有NameAttribute附加到tabbedpane中,并在其中的表中键入和值,这就是我尝试此方法的原因。如果您有任何更好的建议,请让我知道。实际上,这是我尝试将解析后的xml显示到tabb中ed窗格,选项卡上有父节点,表中有子节点。第二部分包括编辑xml文件和输出,主席先生,实际上你是对的,但我必须自己做每一件工作,没有人指导,所以直到我不面对问题时,我才能够知道。除此之外,我是java新手。正如我所说,我的推荐最好不要使用SAX。不过,我强烈建议您将UI与XML解析部分分开——在将XML部分放入UI之前,您应该能够从单元测试或简单的控制台应用程序中测试XML部分。#先生,实际上我已经构建了一个解析器,可以解析XML并在GUI中显示,并在某些编辑标记后显示显示在GUI中,它最终会再次输出xml。请指导我
 for(int i=0;i<=length;i++) {
     typ[i]+=vtype;
     System.out.println("Type is "+typ[i]);
 }
 for (int i = 0;i < length; i++) {
     typ[i] = vtype;
     System.out.println("Type is " + typ[i]);
 }