Java Lang Array Error

Asked

Viewed 96 times

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 the Internet pages and will display these dates on the console. Java lang error on line 122 of the package.

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 executes 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;
    }
}

2 answers

1

why the matrix is 3x11?

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

if the amount of states is 10 its matrix should be 10x11

the matrix 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
  • I did what you said: int[][] matrix = new int[10][11]; The error still happens...

0


why the matrix is 3x11?

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

if the number of states is 11 its matrix should be 11x11

the matrix 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

lacked 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 pack the state index

in the end will stay 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];
  • Now it gives the same error on line 123...

  • Had put two "Q1" in this new state, now it worked with that your solution...!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.