Dúvida com if / else if

11 respostas
M

Bom dia galera do GUJ !!!
Estou montando um menu de cadastro, onde o usuário entra com a opção desejada e caso ele digite um valor não contido nas opções o sistema apresenta uma mensagem e de erro e mostra novamente o menu de opções.
Estou quase lá, está funcionando corretamente nas opções 2, 3, 4, 5, mas na opção 1 o sistema sempre mostra a mensagem de erro ao final do cadastro, sendo que a opção 1 é valida.

Opção 1 na linha 162 e mensagem de erro na linha 219

package cadastroCarro;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * Title:        Testdb
 * Description:  simple hello world db example of a
 *               standalone persistent db application
 *
 *               every time it runs it adds four more rows to sample_table
 *               it does a query and prints the results to standard out
 *
 */
public class MainProject {
	private static Scanner leitor = new Scanner(System.in);
	
    static Connection conn;  //our connnection to the db - presist for life of program
	private String opcao;

    // we dont want this garbage collected until we are done
    public MainProject(String db_file_name_prefix) throws Exception {    // note more general exception

        // Load the HSQL Database Engine JDBC driver
        // hsqldb.jar should be in the class path or made part of the current jar
        Class.forName("org.hsqldb.jdbcDriver");

        // connect to the database.   This will load the db files and start the
        // database if it is not alread running.
        // db_file_name_prefix is used to open or create files that hold the state
        // of the db.
        // It can contain directory names relative to the
        // current working directory
        conn = DriverManager.getConnection("jdbc:hsqldb:"
                                           + db_file_name_prefix,    // filenames
                                           "sa",                     // username
                                           "");                      // password
    }

    public void shutdown() throws SQLException {

        Statement st = conn.createStatement();

        // db writes out to files and performs clean shuts down
        // otherwise there will be an unclean shutdown
        // when program ends
        st.execute("SHUTDOWN");
        conn.close();    // if there are no other open connection
    }

//use for SQL command SELECT
    public synchronized void query(String expression) throws SQLException {

        Statement st = null;
        ResultSet rs = null;

        st = conn.createStatement();         // statement objects can be reused with

        // repeated calls to execute but we
        // choose to make a new one each time
        rs = st.executeQuery(expression);    // run the query

        // do something with the result set.
        dump(rs);
        st.close();    // NOTE!! if you close a statement the associated ResultSet is

        // closed too
        // so you should copy the contents to some other object.
        // the result set is invalidated also  if you recycle an Statement
        // and try to execute some other query before the result set has been
        // completely examined.
    }

//use for SQL commands CREATE, DROP, INSERT and UPDATE
    public synchronized void update(String expression) throws SQLException {

        Statement st = null;

        st = conn.createStatement();    // statements

        int i = st.executeUpdate(expression);    // run the query

        if (i == -1) {
            System.out.println("db error : " + expression);
        }

        st.close();
    }    // void update()

    public static void dump(ResultSet rs) throws SQLException {

        // the order of the rows in a cursor
        // are implementation dependent unless you use the SQL ORDER statement
        ResultSetMetaData meta   = rs.getMetaData();
        int               colmax = meta.getColumnCount();
        int               i;
        Object            o = null;

        // the result set is a cursor into the data.  You can only
        // point to one row at a time
        // assume we are pointing to BEFORE the first row
        // rs.next() points to next row and returns true
        // or false if there is no next row, which breaks the loop
        for (; rs.next(); ) {
            for (i = 0; i < colmax; ++i) {
                o = rs.getObject(i + 1);    // Is SQL the first column is indexed

                // with 1 not 0
                System.out.print(o.toString() + " ");
            }

            System.out.println(" ");
        }
    }                                       // void dump( ResultSet rs )

    public static void main(String[] args) {
    	String opcao;
        MainProject db = null;

        try {
            db = new MainProject("db_file.db");
        } catch (Exception ex1) {
            ex1.printStackTrace();    // could not start db
            return;                   // bye bye
        }

        try {

            //make an empty table
            //
            // by declaring the id column IDENTITY, the db will automatically
            // generate unique values for new rows- useful for row keys
            db.update(
                "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");
        } catch (SQLException ex2) {

            //ignore
            //ex2.printStackTrace();  // second time we run program
            //  should throw execption since table
            // already there
            //
            // this will have no effect on the db
        }
        try {           	
        	
    		do{
    			System.out.println("\n_______________________________________________");
    			System.out.println("\n1. Cadastrar Carro e Quilometragem:");
    			System.out.println("2. Listar os carros cadastrados:");
    			System.out.println("3. Alterar um carro cadastrado:");
    			System.out.println("4. Excluir um carro cadastrado:");
    			System.out.println("5. Sair");
    			System.out.println("\nEscolha a opçao desejada:");
    			
    			opcao = leitor.nextLine();
    			
    			if(opcao.equals("1")){
    				//cadastrar um carro e a quilometragem total do carro
            		String nome;
            		int quilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro?");
        			nome = leitor.nextLine();            		
            		
        			System.out.println("Qual o Quilometragem do carro?");
        			quilometragem = leitor.nextInt();
        			
        	        stu = "INSERT INTO sample_table(str_col,num_col) VALUES ('" + nome + "'," + quilometragem + ")";   
        	        db.update(stu);
        	        System.out.println("Dados inseridos com sucesso!\n\n");
        	        
    			}else if(opcao.equals("2")){   				
                	// listar o conteúdo da tabela                          
                    System.out.println("DADOS CONTIDOS NA TABELA:\n");
                    db.query("SELECT * FROM sample_table");
                    
    			}else if(opcao.equals("3")){   				
                	// alterar o conteúdo do registro da tabela                          
            		String nome;
            		String novoNome;
            		int novaQuilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro que você deseja alterar?");
        			nome = leitor.nextLine(); 
        			
        			System.out.println("Qual o novo nome para o carro cadastrado?");
        			novoNome = leitor.nextLine();         			
        			
        	        //stu = "UPDATE sample_table SET [str_col] = '" + novoNome + "' WHERE [str_col] = '" + nome + "'";
        	        stu = "UPDATE sample_table SET str_col = '" + novoNome + "' WHERE str_col = '" + nome +"'"; 
        	        db.update(stu);
        	        System.out.println("Registro alterados com sucesso!\n\n");          
        	        
    			}else if(opcao.equals("4")){   				
                	// excluir um registro da tabela                          
            		String nome;
            		String stu;
            		
        			System.out.println("Qual o nome do carro que você deseja excluir?");
        			nome = leitor.nextLine(); 
        			        			
        	        //stu = "UPDATE sample_table SET [str_col] = '" + novoNome + "' WHERE [str_col] = '" + nome + "'";
        	        stu = "DELETE FROM sample_table WHERE str_col = '" + nome +"'"; 
        	        db.update(stu);
        	        System.out.println("Registro excluido com sucesso!\n\n");       
        	        
    			}else if(opcao.equals("5")){ 				
                    // SAIR DO PROGRAMA
                    db.shutdown();
                    break;
    			}else{
    				System.out.println("\nOpção Inválida, escolha uma opção de 1 a 5!!!");
    			}
    			
    		} while (opcao!="1" || opcao!="2" || opcao!="3" || opcao!="4" || opcao!="5");
    			
         } catch (SQLException ex3) {
            ex3.printStackTrace();
         }
         
    }    // fim da main()	
}    // fim da classe Testdb

Obrigado!!!

11 Respostas

rolemberg

Cara, usa switch case, o seu codigo irá ficar bem mais limpo, porem vc tera que converter de String(parametro de entrada) para int…

sobre seu erro debug a aplicação e veja qual o valor da variavel que a variavel esta recebendo quando vc passa um…

at

M

rolemberg:
Cara, usa switch case, o seu codigo irá ficar bem mais limpo, porem vc tera que converter de String(parametro de entrada) para int…

sobre seu erro debug a aplicação e veja qual o valor da variavel que a variavel esta recebendo quando vc passa um…

at

Obrigado pela dica mudei para switch case mas está acontecendo algo estranho, quando escolha a opção 2 que é alterar o sistema mostra os dois printf automaticamente como se não passasse pelo scanner, alguém sabe pq?

do{
    			System.out.println("___________________________________");
    			System.out.println("1. Cadastrar Carro e Quilometragem:");
    			System.out.println("2. Listar os carros cadastrados:");
    			System.out.println("3. Alterar um carro cadastrado:");
    			System.out.println("4. Excluir um carro cadastrado:");
    			System.out.println("5. Sair");
    			System.out.println("\nEscolha a opçao desejada:");    			
    			opcao = leitor.nextInt();
    			
    			switch (opcao) {
    			   case 1:   //cadastrar um carro e a quilometragem total do carro         				            		
           			System.out.println("Qual o nome do carro?");
           			nome = leitor.nextLine();            		               		
           			System.out.println("Qual o Quilometragem atual do carro?");
           			quilometragem = leitor.nextInt();           			
           	        stu = "INSERT INTO sample_table(str_col,num_col) VALUES ('" + nome + "'," + quilometragem + ")";   
           	        db.update(stu);
           	        System.out.println("Dados inseridos com sucesso!\n\n");   
           	        
    			   case 2: // listar o conteúdo da tabela                    	                         
                       System.out.println("DADOS CONTIDOS NA TABELA:\n");
                       db.query("SELECT * FROM sample_table order by str_col");
                       
    			   case 3: // alterar o conteúdo do registro da tabela                		
           			System.out.println("Qual o nome do carro que você deseja alterar?");
           			nome = leitor.nextLine();            			
           			System.out.println("Qual o novo nome para o carro cadastrado?");
           			novoNome = leitor.nextLine();         			           			           	        
           	        stu = "UPDATE sample_table SET str_col = '" + novoNome + "' WHERE str_col = '" + nome +"'"; 
           	        db.update(stu);
           	        System.out.println("Registro alterados com sucesso!\n\n");
           	        
    			   case 4: // excluir um registro da tabela               		
           			System.out.println("Qual o nome do carro que você deseja excluir?");
           			nome = leitor.nextLine(); 
           	        stu = "DELETE FROM sample_table WHERE str_col = '" + nome +"'"; 
           	        db.update(stu);
           	        System.out.println("Registro excluido com sucesso!\n\n");       
           	        
    			   case 5: // SAIR DO PROGRAMA                       
                       db.shutdown();
                       break;    				       				   
    			   default:
    				   System.out.println("\nOpção Inválida, escolha uma opção de 1 a 5!!!");
    			     //break;
    			}    			
    		} while (opcao!=1 || opcao!=2 || opcao!=3 || opcao!=4 || opcao !=5);
luistiagos

ta faltando os breaks nos cases…

lembre-se em java tenque ser sempre assim

case x: //seu codigo
break;
case y: …

se não colocar os breaks se vc executar a opção 1 ele vai executar todos os cases…

M

luistiagos:
ta faltando os breaks nos cases…

lembre-se em java tenque ser sempre assim

case x: //seu codigo
break;
case y: …

se não colocar os breaks se vc executar a opção 1 ele vai executar todos os cases…

Puts q erro bobo…

Corrigi mas o sistema continua ignorando o Scanner, quando seleciono a opção 1 o sistema mostra os dois printf sem esperar o usuário entrar com o 1º valor, alguma dica?

ViniGodoy

A título de curiosidade: http://www.guj.com.br/posts/list/55885.java

M

Não consigo fazer o case esperar o usuário digitar o comando, alguma dica?

M

massucato:
Não consigo fazer o case esperar o usuário digitar o comando, alguma dica?

UP…

ViniGodoy

Não fique upando tópicos, principalmente num intervalo tão curto de tempo!!!

Use sempre nextLine(). A leitura de um teclado sempre acaba no enter. Depois, use os métodos de Integer.parseInt para ajustar o tipo de dado retornado, se for o caso.
Ou então passe a solicitar dados com o JOptionPane.showInputDialog.

claudneto

Eu vi isso em um programa do curso q eu to fazendo…

Scanner pra String vem sempre antes dos int…

Não sei pq e meu prof não sabe pq tbm…mas sempre da certo se vc colocar todos os Scanners q são strings antes dos q sao int (ou numeros)…

Não li seu código…então talvez não fosse esse o caso…mas fica ae de alerta…

claudneto
import java.util.Scanner;

class Carro {
  String marca;
  String modelo;
  int ano;
}

class UsaCarro {
  public static void main (String[] args) {
    Carro[] carro = new Carro[1];
    Scanner sc = new Scanner(System.in);
    System.out.println("Ano: ");
    carro[0].ano = sc.nextInt();
    System.out.println("Marca: ");
    carro[0].marca = sc.nextLine();
    System.out.println("Modelo: ");
    carro[0].modelo = sc.nextLine();
    
    System.out.println();
    System.out.println();
    System.out.println("Marca: " + carro[0].marca);
    System.out.println("Modelo: " + carro[0].modelo);
    System.out.println("Ano: " + carro[0].ano);
  }
}

Não testei...mas eu tinha feito algo parecido na aula e deu o problema...

J

olá!
pesquise sobre a class javax.swing.JOptionPane
ele é bem melhor do que trabalhar no modo texto :wink:
tu pode fazer todas as entradas (menu) e saídas com ela (tem umas “showmessage” quase igual ao do delphi e outras bem legais, botoes personalizados e tudo mais)
flws!

Criado 19 de setembro de 2008
Ultima resposta 19 de set. de 2008
Respostas 11
Participantes 6