Проблема инициализации многомерного массива - PullRequest
0 голосов
/ 06 июля 2011

Так что для моего проекта я пытаюсь хранить массивы внутри массивов внутри массивов и т. Д., И т. Д. И я задал предыдущий вопрос о том, как это сделать, и получил решение, которое не возвращало ошибок компилятора, но во время выполнения я получаю короткое сообщение об ошибке, и программа просто завершается. Вот мой код:

Java-код

import java.io.*;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class Test
{   
    private static int index = 0;
    private static int index2 = 0;
    private static int heading1Instance = 0;
    private static int heading2Instance = 0;
    private static int heading3Instance = 0;
    private static int heading4Instance = 0;
    private static Object[][] docArray = new String[6][];
    private static Object[][] subDocArray = (Object[][])docArray[3][0];
    private static Object[][] sub2DocArray = (Object[][])subDocArray[3][0];
    private static Object[][] sub3DocArray = (Object[][])sub2DocArray[3][0];

    public static void main (String[] args)
    {
        traverse(new File("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items"));
    }

    private static final class SaxHandler extends DefaultHandler 
    {
        private boolean bHeading = false;
        private boolean bBodyText = false;


        // invoked when document-parsing is started:
        public void startDocument() throws SAXException 
        {
            //do nothing...
            //System.out.println("Document processing starting:");
        }

        // notifies about finish of parsing:
        public void endDocument() throws SAXException 
        {
            //do nothing...
            //System.out.println("Document processing finished. \n");
        }

        // we enter to element 'qName':
        public void startElement(String uri, String localName, 
                String qName, Attributes attrs) throws SAXException 
        {
            String headingVal = "";

            // if the qualified name equals "w:Style"...
            if(qName.equalsIgnoreCase("w:pStyle"))
            {
                // the headingVal = the value of the attribute "w:val"
                headingVal = attrs.getValue("w:val");

                // if the headingVal starts with/is "Heading1"
                if (headingVal.startsWith("Heading1", 0))
                {               
                    // increment the heading1Instance to keep track of it...
                    heading1Instance++;

                    // if heading1Instance equals 1, set boolean Heading 
                    // equal to true. Also set index 1 in docArray equal
                    // to the value of headingVal.
                    if (heading1Instance == 1)
                    {
                        bHeading = true;
                        docArray[index+1].equals(headingVal);
                    }

                    // if heading1Instance is greater than 1, set boolean Heading 
                    // equal to true. Also create a new subArray called siblingArray
                    // & set index 1 in siblingArray equal to the value of headingVal.
                    if (heading1Instance > 1)
                    {
                        bHeading = true;
                        Object[][] siblingArray = (Object[][])docArray[4][0];
                        siblingArray[index+1].equals(headingVal);
                    }
                }
                if (headingVal.startsWith("Heading2", 0))
                {               
                    heading2Instance++;
                    bHeading = true;
                    subDocArray[index+1].equals(headingVal);
                }
                if (headingVal.startsWith("Heading3", 0))
                {               
                    heading3Instance++;
                    bHeading = true;
                    sub2DocArray[index+1].equals(headingVal);
                }
                if (headingVal.startsWith("Heading4", 0))
                {               
                    heading4Instance++;
                    bHeading = true;
                    sub3DocArray[index+1].equals(headingVal);
                }
            }

            if(qName.equalsIgnoreCase("w:t"))
            {
                bBodyText = true;
            }
        }

        public void characters(char[] ch, int start, int length) 
        {
             if(bBodyText) 
             {
                 //System.out.print(new String(ch, start, length));
             }
        }

        public void endElement(String uri, String localName, String qName) throws SAXException 
        {
            if(qName.equalsIgnoreCase("w:pStyle"))
            {
                bHeading = false;
            }
            if(qName.equalsIgnoreCase("w:t"))
            {
                bBodyText = false;
            }
        }
     }

     private static void traverse(File directory)
     {
        //Get all files in directory
        File[] files = directory.listFiles();
        for (File file : files)
        {
            if (file.getName().equals("document.xml"))
            {
                try 
                {         
                    // creates and returns new instance of SAX-implementation:
                    SAXParserFactory factory = SAXParserFactory.newInstance();

                    // create SAX-parser...
                    SAXParser parser = factory.newSAXParser();

                    // prints out the current working proposal, traversing up the directory structure
                    // System.out.println(file.getParentFile().getParentFile().getParentFile().getName());
                    // .. define our handler:
                    SaxHandler handler = new SaxHandler();

                    // and parse:
                    parser.parse(file.getAbsolutePath(), handler);    
                } 
                catch (Exception ex) 
                {
                    ex.printStackTrace(System.out);
                }
                System.out.println(docArray);
            }
            else if (file.isDirectory())
            {
                //It's a directory so (recursively) traverse it
                traverse(file);
            }
        }
    }
}

Основное внимание здесь уделяется первой половине кода, а именно:

    private static Object[][] docArray = new String[6][];
    private static Object[][] subDocArray = (Object[][])docArray[3][0];
    private static Object[][] sub2DocArray = (Object[][])subDocArray[3][0];
    private static Object[][] sub3DocArray = (Object[][])sub2DocArray[3][0];

Во время выполнения я получаю следующую ошибку:

java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
    at Test.<clinit>(Test.java:20)
Exception in thread "main" 

Итак, это указывает на линию:

private static Object[][] subDocArray = (Object[][])docArray[3][0];

Я прочитал об ошибке, но я не совсем уверен, что это значит. Я предполагаю, что это какой-то тип ошибки приведения. Однако я понятия не имею, как это исправить, чтобы это работало. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 июля 2011
Object[][] docArray = new String[6][]

объявляет docArray как массив массивов строк.

Так что следующая строка не имеет смысла:

Object[][] subDocArray = (Object[][])docArray[3][0];

означает «взять 0-ю строку третьего массива строк docArray и попытаться преобразовать эту строку в массив массивов объектов».

Помимо проблемы с типом, у вас также есть другая проблема. Когда массив объектов инициализируется, он полон нулевых значений. Таким образом, получение значения из этого массива всегда будет возвращать ноль. И попытка получить 0-й элемент нуля приводит к исключению NullPointerException.

Обратите внимание, что наличие массивов массивов объектов довольно сложно читать и понимать, и часто является признаком отсутствия дизайна. Используйте четко определенные классы, а не массивы объектов.

1 голос
/ 06 июля 2011

Из-за вашего определения docArray, docArray[3] равно нулю. Это причина, по которой вы получаете исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...