Galera estou com um bug nesse código alguém pode me ajudar a melhorá-lo?

9 respostas
T

há bug quando executa mais de uma vez (a senha está acumulando com a senha antiga).

package Senha;

import java.util.Scanner;

public class ServidorOTP {
	private String[]caracteres = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
	private String senha = "";
	int tipo;
	String codigo;
	
	Scanner teclado = new Scanner(System.in);
	
	public String getsenha() {
		return senha;
	}
	
	public void setsenha(String senha){
		this.senha = senha; 
	}
	
	void validatipo(int tipo) {
		if(tipo == 1){
			gsa();
		}else if (tipo == 2 ) {
			si();
		}if (tipo == 3) {
			vs();
		}
	}

	void gsa() {
		for (int x=0; x<8; x++) {
			int j = (int) (Math.random()*caracteres.length);
			senha += caracteres[j];
		}
	    System.out.println(" Seu código é:"+senha);
	    		
	}
		
	void si() {
		System.out.println("Digite a Senha: ");
		senha = teclado.next();
		
		while (senha.length() >8 || senha.length()<8) {
			System.out.println("Digite uma senha que contenha 8 caracteres!");
			System.out.println("Digite a senha: ");
			senha = teclado.next();
		}
	    System.out.println("Seu código é: "+senha);
	}

	void vs() {
		System.out.println("Insira o código: ");
		codigo = teclado.next();
		
		if(codigo.equals(senha)) {
			System.out.println("!Parabéns!");
			this.setsenha(null);
		}else if (senha == null){
			System.out.println("Código expirado");
		}else {
			System.out.println("Código divergente");
		}
	}
}

9 Respostas

I

Onde você chama o método validaTipo? Poste a linha onde ocorre a invocação.

T

package Senha;

import java.util.Scanner;

public class principal {

public static void main(String[] args){
	ServidorOTP senhatest = new ServidorOTP ();
	Scanner teclado = new Scanner(System.in);
	
	do{
		System.out.println(".---Digite opção 1 ou 2-----\n");
		System.out.println("1. Gerar código");
		System.out.println("2. Inserir senha");
		System.out.println("3. Entrar");
		System.out.println("5. Sair");
		
	senhatest.tipo = teclado.nextInt();
	senhatest.validatipo(senhatest.tipo);
	
	}while(senhatest.tipo !=0);
	
	
	
}

}

I

Todos os dados são lidos em ordem (com o Scanner) ou ele pular uma leitura? Ou seja, não é problema com o Scanner, aquele ‘bugzinho’ de leitura? Quando você diz:

Significa que tu executa novamente o código? Está usando IDE ou o CMD?

T

estou usando ide, Eclipse

T

O que você me indicaria a mudar no código para ter uma funcionalidade melhor ? sem que ocorra bugs

I

Piá, eu coloquei um método sair que ‘limpa’ as variáveis. Tu não tem a opção válida para o tipo 5 (sair). Daí, testei e funcionou tranquilo aqui.

Obs 1: Nome de classe começa com letra maiúscula;
Obs 2: Prefira usar CameCase. Troquei validatipo por validaTipo.
Obs 3: troquei os vários ifs do método valida tipo pelo switch. Veja:

void validaTipo(int tipo){
	switch(tipo){
		case 1:
			gsa();
			break;
		case 2:
			si();
			break;
		case 3:
			gsa();
			break;
		case 5:
			sair();
	}
}

void sair(){
	senha = "";
	tipo = 0;
	codigo = "";
	System.out.println("\nSaindo...");
}

Então se tu sai ele ‘limpa’ as informações. Se tu quiser geral outro código ou inserir uma nova senha sem sair, é claro que ele vai adicionar a senha velha à nova, já que a senha velha é adicionada (concatenada) com a senha nova:

senha += caracteres[j];

Logo, não sobrescrição e sim concatenação.

T

irei testar aqui, vllw mesmo. Caso eu não consiga vou comentar aqui novamente

T

Não consegui mano!

staroski

Instancia ServidorOTP dentro do laço que vai funcionar.

Por que você precisa setar o atributo tipo sendo que você passa ele por parâmetro?

Criado 15 de abril de 2020
Ultima resposta 16 de abr. de 2020
Respostas 9
Participantes 3