Java Lang Array Error

0

Good afternoon, I'm adapting this code to make the search based on an automaton. The automaton will search for dates in the source codes of web pages and will display those dates on the console. This is a java lang error on line 122 of the package buscapadraoweb.

package buscapadraoweb;

import buscaweb.CapturaRecursosWeb;
import java.util.ArrayList;


public class Main {
// busca char em vetor e retorna indice
public static int get_char_ref (char[] vet, char ref ){
    for (int i=0; i<vet.length; i++ ){
        if (vet[i] == ref){
            return i;
        }
    }
    return -1;
}

// busca string em vetor e retorna indice
public static int get_string_ref (String[] vet, String ref ){
    for (int i=0; i<vet.length; i++ ){
        if (vet[i].equals(ref)){
            return i;
        }
    }
    return -1;
}



//retorna o próximo estado, dado o estado atual e o símbolo lido
public static int proximo_estado(char[] alfabeto, int[][] matriz,int estado_atual,char simbolo){
    int simbol_indice = get_char_ref(alfabeto, simbolo);
    if (simbol_indice != -1){
        return matriz[estado_atual][simbol_indice];
    }else{
        return -1;
    }
}


public static void main(String[] args) {
    //instancia e usa objeto que captura código-fonte de páginas Web
    CapturaRecursosWeb crw = new CapturaRecursosWeb();
    crw.getListaRecursos().add("http://www.mercadolivre.com");
    ArrayList<String> listaCodigos = crw.carregarRecursos();

    String codigoHTML = listaCodigos.get(0);

    //mapa do alfabeto
    char[] alfabeto = new char[11];
    alfabeto[0] = '-';
    alfabeto[1] = '0';
    alfabeto[2] = '1';
    alfabeto[3] = '2';
    alfabeto[4] = '3';
    alfabeto[5] = '4';
    alfabeto[6] = '5';
    alfabeto[7] = '6';
    alfabeto[8] = '7';
    alfabeto[9] = '8';
    alfabeto[10] = '9';



    //mapa de estados
    String[] estados = new String[10];
    estados[0] = "q0";
    estados[1] = "q1";
    estados[2] = "q3";
    estados[3] = "q4";
    estados[4] = "q5";
    estados[5] = "q6";
    estados[6] = "q7";
    estados[7] = "q8";
    estados[8] = "q9";
    estados[9] = "q10";



    String estado_inicial = "q0";

    //estados finais
    String[] estados_finais = new String[1];
    estados_finais[0] = "q10";

    //tabela de transição de AFD para reconhecimento números de dois dígitos
    int[][] matriz = new int[3][11];
    //transições de q0
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q1");
    matriz[get_string_ref(estados, "q0")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q1");
    //transições de q1
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q2");
    matriz[get_string_ref(estados, "q1")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q2");
    //transições de q2
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q3");
    matriz[get_string_ref(estados, "q2")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q3");
    //transições de q3
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q4");
    matriz[get_string_ref(estados, "q3")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q4");
    //transições de q4
    matriz[get_string_ref(estados, "q4")][get_char_ref(alfabeto, '-')] = get_string_ref(estados, "q5");
    //transições de q5
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q6");
    matriz[get_string_ref(estados, "q5")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q6");
    //transições de q6
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q7");
    matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q7");
    //transições de q7
    matriz[get_string_ref(estados, "q7")][get_char_ref(alfabeto, '-')] = get_string_ref(estados, "q8");
    //transições de q8
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q9");
    matriz[get_string_ref(estados, "q8")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q9");
    //transições de q9
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '0')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '1')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '2')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '3')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '5')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '6')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '7')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '8')] = get_string_ref(estados, "q10");
    matriz[get_string_ref(estados, "q9")][get_char_ref(alfabeto, '9')] = get_string_ref(estados, "q10");
    //transições de q10
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '0')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '1')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '2')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '3')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '4')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '5')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '6')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '7')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '8')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '9')] = -1;
    matriz[get_string_ref(estados, "q10")][get_char_ref(alfabeto, '-')] = -1;

    int estado = get_string_ref (estados, estado_inicial);
    int estado_anterior = -1;
    ArrayList<String> palavras_reconhecidas = new ArrayList();

    String palavra = "";

    //varre o código-fonte de um código
    for (int i=0; i<codigoHTML.length(); i++){

        estado_anterior = estado;
        estado = proximo_estado(alfabeto, matriz, estado, codigoHTML.charAt(i));
        //se o não há transição
        if (estado == -1){
            //pega estado inicial
            estado = get_string_ref(estados, estado_inicial);
            // se o estado anterior foi um estado final
            if (get_string_ref(estados_finais, estados[estado_anterior]) != -1){
                //se a palavra não é vazia adiciona palavra reconhecida
                if ( ! palavra.equals("")){
                    palavras_reconhecidas.add(palavra);
                }
                // se ao analisar este caracter não houve transição
                // teste-o novamente, considerando que o estado seja inicial
                i--;
            }
            //zera palavra
            palavra = "";

        }else{
            //se houver transição válida, adiciona caracter a palavra
            palavra += codigoHTML.charAt(i);
        }
    }

    //foreach no Java para exibir todas as palavras reconhecidas
    for (String p: palavras_reconhecidas){
        System.out.println (p);
    }
}

}

Below is the error that happens:

run:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at buscapadraoweb.Main.main(Main.java:122)
Java Result: 1

The code that performs the search:

package buscaweb;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SocketHandler;

/**
 *
 * @author Santiago
 */
public class CapturaRecursosWeb {
    private ArrayList<String> listaRecursos = new ArrayList();


    public ArrayList<String> carregarRecursos(){
        ArrayList<String> resultado = new ArrayList();
        for (String stringURL: listaRecursos){
            String resposta = "";

            try {
                URL url = new URL(stringURL);
                URLConnection connection = url.openConnection();
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        connection.getInputStream()));

                String inputLine;

                StringBuffer sb = new StringBuffer();
                while ((inputLine = in.readLine()) != null) sb.append(inputLine+"\n");
                resposta = sb.toString();
                resultado.add(resposta);
                in.close();
            } catch (MalformedURLException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return resultado;
    }

    /**
     * @return the listaRecursos
     */
    public ArrayList<String> getListaRecursos() {
        return listaRecursos;
    }
}
    
asked by anonymous 23.08.2015 / 22:56

2 answers

0

Why is the array 3x11?

int[][] matriz = new int[3][11];

If the number of states is 11 your array should be 11x11

the array is accessing an index that does not exist example:

matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q7");
//get_string_ref(estados, "q6") // index 5
//get_char_ref(alfabeto, '4') // index 5
//get_string_ref(estados, "q7") // index 6
//matriz[5][5] = 6  //erro de index ja que sua matriz é de 3x11
  

update

missing the "q2":

 String[] estados = new String[10];
    estados[0] = "q0";
    estados[1] = "q1";
    estados[2] = "q2";  <=============
    estados[3] = "q3";
   // ...

  //get_string_ref(estados, "q2"); //index -1
  //matrix[-1][2]//erro de index

Do not forget to fix state indexes

In the end it looks like this:

    String[] estados = new String[11];
    estados[0] = "q0";
    estados[1] = "q1";
    estados[2] = "q2";
    estados[3] = "q3";
    estados[4] = "q4";
    estados[5] = "q5";
    estados[6] = "q6";
    estados[7] = "q7";
    estados[8] = "q8";
    estados[9] = "q9";
    estados[10] = "q10";


    int[][] matriz = new int[11][11];
    
23.08.2015 / 23:35
1

Why is the array 3x11?

int[][] matriz = new int[3][11];

If the number of states is 10 your array should be 10x11

the array is accessing an index that does not exist example:

matriz[get_string_ref(estados, "q6")][get_char_ref(alfabeto, '4')] = get_string_ref(estados, "q7");
//get_string_ref(estados, "q6") // index 5
//get_char_ref(alfabeto, '4') // index 5
//get_string_ref(estados, "q7") // index 6
//matriz[5][5] = 6  //erro de index ja que sua matriz é de 3x11
    
23.08.2015 / 23:13