Problema ao manipular string

Opa. Estou percorrendo um arquivo de texto e tenho que achar determinada palavra neste arquivo. Acontece que esta determinada palavra pode variar, então criei um arquivo de texto para funcionar como um “dicionário”. O que estou tentando fazer é ler esse arquivo (dicionário), e a cada linha percorrer cada char do meu arquivo de texto e comparar se a primeira letra da palavra do dicionário é igual a que estou varrendo no arquivo. Se for, eu copio este char para uma string e vejo se a próxima letra do arquivo de texto é igual a segunda letra da palavra do dicionário. Se não for, eu sigo varrendo o arquivo.

Ao meu ver parece fazer sentido, meu maior problema é realmente conhecer as classes do java.
Aqui esta um pouco do código e o erro que estou tendo:

      String portal = new String("");
      String linhaArqPortais = new String(" ");
      FileReader lePortais = new FileReader(dirPortais);
      BufferedReader lerArqPortais = new BufferedReader(lePortais);
      linhaArqPortais = lerArqPortais.readLine();
      int count = conteudo.length()-1;
      int pos = 1;    
      while (linhaArqPortais != null) {
    	  linhaArqPortais = lerArqPortais.readLine();
    	  RgxPortal = linhaArqPortais;
    	  for (int i = 0; i < count; i++) {
			if (conteudo.charAt(count)==linhaArqPortais.charAt(pos)){
				portal = portal+conteudo.charAt(count);
				pos++;
				if (portal==linhaArqPortais) {
				      System.out.println("PORTAL ENCONTRADO: "+portal);
				}
			}
			else {
				pos=1;
				portal = "";
			}
		}
	}

Exception in thread “main” java.lang.NullPointerException

O problema parece acontecer quando vou alimentar a variável portal com a posição atual.

Substitua este “==” que você está usando para comparar Strings por “.equals()”

Assim:

if (portal.equals(linhaArqPortais)) {
      System.out.println("PORTAL ENCONTRADO: "+portal);
}

Veja o porque disso aqui.

Execute seu código de novo e veja se resolveu.

Obrigado pela ajuda Douglas, mas infelizmente o problema está na minha comparação “if conteudo.charAt(i)==linhaArqPortais.charAt(pos)”. Ainda estou tentando descobrir o que.

Fiz alguns ajustes. Ele aponta estar tentando buscar um index vazio, mas não entendoo, todos os index estão povoados de informações (chars do texto).

while (linhaArqPortais != null) {
    	  i = 0;
    	  pos=0;
    	  portal = "";
    	  linhaArqPortais = lerArqPortais.readLine();
    	  RgxPortal = linhaArqPortais;
    	  for (i = 0; i < count; i++) {
			if (conteudo.charAt(i)==linhaArqPortais.charAt(pos)) {
				portal=portal+(conteudo.charAt(i));
				pos++;
			  }
			if (portal.equals(linhaArqPortais)) {
					System.out.println("PORTAL ENCONTRADO: "+portal);
			}
			else {
				pos=0;
				portal = "";
		}
	  }
    }

Está lançando “IndexOutOfBoundsException” nessa linha? Note que, depois que seu código percorrer tudo ele pode lançar uma Exception por não encontrar mais nada além do que já foi percorrido.

Rode a aplicação no modo Debug (na sua IDE) e ela vai parar no momento em que a exception é lançada, e você poderá ver (ao colocar o cursor em cima da variável) o que está dentro de cada variável: Verifique “conteudo”, “linhaArqPortais”, “i” e “pos”, para ver se não está tentando pegar um caracter num índice >= ao .lenght() dessas Strings.

Seu código quebrará se “cont” for >= conteudo.lenght(), e quebrará se “pos” tornar-se em alguma iteração >= linhaArqPortais.lenght(). Sugiro que você coloque ifs para verificar se estas situações ocorrem.

Cara, estou quebrando a cabeça e ainda não entendo como os index poderiam ultrapassar o index que está tentando ser atribuido. Só aumento a variável pos se ele achar uma letra igual a que há no dicionário, e se achar a segunda aumenta de novo, assim por diante. Se não achar, eu zero ela e começo de novo com a próxima palavra.

Coloquei uma nova condição para não ler a última linha, que é null. A questão é que ele não está achando a palavra do dicionário no texto.
Condição:

if (linhaArqPortais == null){
    		  System.out.println("NENHUM PORTAL ENCONTRADO");
    		  break;
    	  }
    	  else { continua o processo

Dica: utilize o Try no seu código, pois para trabalhar com arquivos o ideal é utiliza-lo para abrir e fechar automaticamente a leitura e não ocasionar erros.

Opa Wallace, falha minha não estar postando o código todo. Há uma outra parte do código que extrai a informação do arquivo e joga para a variável conteudo. Todo o código está dentro de um try com um catch no final jogando um erro. O fato é que não estou tendo problemas com a abertura do arquivo, mas sim com o tratamento das informações contidas no mesmo.

Sendo assim eu aconselho você criar um método genérico e externo para realizar apenas a leitura de arquivos, e criar outro método específico para gerenciar arquivos, como por exemplo, a verificação de um conteúdo existente.

Opa Wallace! Com certeza manter uma estrutura OO ajuda na organização do código. Futuramente quero deixar o código todo com esta organização, mas inicialmente estou na fase de testes e não achei necessário, estou focando na lógica do algoritmo. Irei seguir a dica e tratar de nomear os processos de abertura de arquivos e tratamento de informações.

1 curtida

Procure sempre começar do jeito certo, pois na vida real as empresas e clientes não costumam liberar horas para refatorar código podre.
Acredite, um pequeno código mal organizado aqui e outro pequeno código mal organizado ali, acaba resultando num código mal organizado gigante.
Leva pouco tempo para se criar um monstro que ninguém quer manter.

Posta o seu código completo que fica fácil achar a causa do seu problema.

Outra coisa, evita fazer instanciações desnecessárias, como essas duas linhas que você escreveu:

String portal = new String("");
String linhaArqPortais = new String(" ");

Obrigado pelas dicas staroski. Assim que chegar em casa farei a reformulação do código e envio ele por completo aqui.