在执行之前循环读取两次

时间:2014-11-05 17:13:06

标签: java for-loop

每当我运行这个程序时,for循环总是会在其中打印出2次消息,然后让我为其中的字符串分配任何内容,但它会增加i变量。

这是循环:

String rua;

for(int i = 1 ; i < horizontal ; i++ ){
    do{
        System.out.println("Introduza os "+ vertical + " valores da rua " + i);
        rua = stringTest("erro", sc);
    } while(rua.length() != vertical);
}    

在让我为字符串分配任何类型的文本之前,它总是打印两次消息,一个带有i = 1,另一个带有i = 2。 我认为没有理由发生这种情况,也无法找到错误。

请求的其余代码

public class SeriousLand {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);

    System.out.println("Quantas ruas horizontais? (valor entre 2 e 50)");
    int horizontal = SeriousLand.lerValorNoIntervalo(2, 50, "Pretendo um inteiro entre 2 e 50", sc);
    System.out.println("Quantas ruas verticais? (valor entre 2 e 50)");
    int vertical =SeriousLand.lerValorNoIntervalo(2, 50, "Pretendo um inteiro entre 2 e 50", sc);
    System.out.println("Qual a rua horizontal do ponto P? (valor entre 1 e "+horizontal+")");
    int horiP = SeriousLand.lerValorNoIntervalo(1, horizontal, "Pretendo um inteiro entre 1 e "+ horizontal, sc);
    System.out.println("Qual a rua vertical do ponto P? (valor entre 1 e " + vertical + ")");
    int veriP =SeriousLand.lerValorNoIntervalo(1, vertical, "Pretendo um inteiro entre 1 e " + vertical, sc);

            String rua;

            for(int i = 1 ; i < horizontal ; i++ ){
                do{
        System.out.println("Introduza os "+ vertical + " valores da rua " + i);
        rua = stringTest("erro", sc);

                }
                while(rua.length() != vertical);

                }        
            //linha++;



    /*do {
        for (int i = 1; i <= horizontal; i++) {
            System.out.println("Introduza os "+ vertical + " valores da rua " + i);
            val = true;
            for (int j = 1; j <= vertical; j++) {
                int valor = sc.nextInt();
                if (valor != '-' || valor != '.') {
                    SeriousLand.imprimeErro(vertical, i);
                    val = false;
                }
            }
            linha++;
        } 
    }while (linha <= horizontal);



    */
    }

 static String lerSimbolo ( String errMess, Scanner sc ) {
    boolean erro = true;
    String simbolo = "";
    do {
        if ( sc.hasNextLine () ) {
        simbolo = sc.nextLine ();  // consome a String
        erro = false;
        }   
        else {
        sc.next ();      // consome o que lah esteja
        System.out.println ( errMess );
        }               
    } while ( erro );

    return simbolo;

}



/**
 * Ler numero inteiro no canal de leitura
 * @param errMess - mensagem a escrever no System.out caso o valor 
 *              acessivel no canal de leitura nao seja um inteiro
 * @param sc - canal de leitura
 * @return valor inteiro
 * @requires errMess != null && sc != null
 */
static int lerInteiro ( String errMess, Scanner sc ) {
    int valor = 0;
    boolean erro = true;
    do {
        if ( sc.hasNextInt () ) {
        valor = sc.nextInt ();  // consome o inteiro
        erro = false;
        }   
        else {
        sc.next ();      // consome o que lah esteja
        System.out.println ( errMess );
        }               
    } while ( erro );

    return valor;

} 


/**
 * Ler numero inteiro no canal de leitura que esta num dado intervalo
 * @param infLim   Limite inferior do intervalo
 * @param supLim  Limite superior do intervalo
 * @param errMess  Mensagem de  erro a apresentar no System.out
 * @param sc  Canal de leitura
 * @return um valor entre infLim e supLim
 * @requires sc != null && infLim <= supLim && errMess != null
 */
static int lerValorNoIntervalo(int infLim, int supLim, 
                                     String errMess, Scanner sc) {
    int valor = 0;
    boolean erro;
    do {
        valor = lerInteiro ( errMess, sc );
        erro = valor < infLim || valor > supLim;
        if ( erro )
           System.out.println ( errMess );
    } while ( erro );

    return valor;
}

public static int lerValorDaLinha(String rua, int coluna, Scanner sc,String erroMess){
    int conta = rua.length() + 1;
    boolean erro;
    do {
        conta = coluna;
        erro = conta < coluna || conta > coluna;
        if ( erro )
           System.out.println ( erroMess );
    } while ( erro );
    return conta;


}

public static void imprimeErro(int vertical,int linha) {

    System.out.println("Erro nos valores introduzidos! Tente de novo");     
    System.out.println("Introduza os "+ vertical + " valores da rua " + linha + " : ");

    }
    public static String stringTest (String errMess, Scanner sc){
        String teste = sc.nextLine();
        boolean erro = false;



        do {
            teste.replaceAll("-","");
            teste.replaceAll(".","");



            if(teste.length() == 0)
                erro = true;
            else
                System.out.println(errMess);
        }
        while(erro = false);


        return teste;

    }

}

1 个答案:

答案 0 :(得分:0)

首先,您必须检查String是否仅填充了char' - '或'。'并且您没有参考,但您还需要检查长度是否正确。 要做到这一点,你将不得不创建方法来验证:(未完成的代码)

String rua = verificaTamanhoSimbolos(sc, vertical);

verificaTamanhoSimbolos(Scanner sc, int vertical) {
boolean erro = true;
do{
erro = true;
System.out.println("Introduza os "+ vertical + " valores da rua " + i);
String linha = sc.nextLine();
if(verificaTamanho(linha, verticais)) erro = false;
else System.out.println("Tamanho errado");
if(verificaSimbolos(linha)) erro = false;
else System.out.println("Simbolo errado");
}while(erro);

verificaTamanho(String linha, int verticais) {
if(linha.length() == verticais) return true;
else return false
}

verificaSimbolos(String linha) {
boolean erro = true;
for (int c = 0; c < linha.length(), c++) {
if (linha.charAt(c) != '-' && linha.charAt(c) != '.') erro = false;
}
return erro;
}