Erro: Divisão por zero

Bom dia, estou criando uma parte do meu projeto, onde se pega alguns valores inteiros do banco após apertar um botão, porém antes de se apertar o botão os valores estão nulos, ou seja, “0”.

Porém, esses valores eu vou realizar alguns calculos, e envolve divisão para o calculo de uma porcentagem, e a lógica esta perfeita, porém qdo eu tento executar todo o projeto(ao qual começa num frame bem antes de chegar nesse frame final onde consigo ver essas porcentagens), o netbeans ja me gera um erro de divisão por zero e não consigo executar… como posso resolver isso?

Vou detalhar um pouco, em minha classe onde será realizada a conta que envolve divisão, eu declaro um array, sem atribuir valor…na classe anterior, onde há o botao que fará essa classe dos arrays aparecer, possui um acesso a meu DAO onde retorno um array com os valores do banco que preciso, e jogo os valores para a classe do array.

Porém o java esta interpretando a classe do array antes de eu realizar a consulta, entao ele está com valores nulos, e por isso ja me gera erro de divisão por zero

Cara, está muito confuso. Não tem como postar algum código?

E você já conseguiu entender pq o java está fazendo essa chamada inválida?

Esta é a classe onde eu faço a divisão para conseguir minha porcentagem

public int dados[]=new int[9];

....

jProgressBar1.setBackground(new java.awt.Color(255, 255, 255));
        jProgressBar1.setForeground(new java.awt.Color(153, 153, 255));
        jProgressBar1.setValue((dados[1]*100)/dados[8]);
        jProgressBar1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 2));
        jProgressBar1.setFocusable(false);
        jProgressBar1.setOpaque(true);
        jProgressBar1.setStringPainted(true);

Esta é a classe que possui o botao, que chama meu DAO e seta os valores na classe acima:

if(String.valueOf(this.ComboBox_acoes.getSelectedItem()).equals("Porcentagem de Produção"))
        {
            Banco.Comandos_BD comandos=new Banco.Comandos_BD();
            frame_producao.dados=comandos.consultaProduçao();
            frame_producao.setVisible(true);
            frame_producao.frameAnterior(this);
        }

Esse é meu metodo no DAO que consulta os dados que necessito e retorna um array[]:

public int[] consultaProduçao()
    {
        int dados[]=new int[9];
        Statement consulta;
        ResultSet retorno;
        String comando="SELECT * FROM producao";
        String soma="SELECT SUM(dados_inseridos) AS total FROM producao";
        Conecta_BD.carregarDriver();
        Connection conn=Conecta_BD.carregarServidor();
        try
        {
            consulta=conn.createStatement();
            retorno=consulta.executeQuery(comando);
            while(retorno.next())
            {
                if(retorno.getString("admin").equals("admin"))
                {dados[0]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_cesar"))
                {dados[1]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_felipe"))
                {dados[2]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_giovanni"))
                {dados[3]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_giovanna"))
                {dados[4]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_guilherme"))
                {dados[5]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_jefferson"))
                {dados[6]=retorno.getInt("dados_inseridos");}
                if(retorno.getString("admin").equals("admin_yuri"))
                {dados[7]=retorno.getInt("dados_inseridos");}
            }
            retorno=consulta.executeQuery(soma);
            while(retorno.next())
            {
                dados[8]=retorno.getInt("total");
            }

        }
        catch(Exception e)
        {
            System.out.println("Erro: consultaProducao()");
        }
        return dados;
    }

Portanto, pode-se ver ue minha classe onde possuo os ProgressBars os arrays começam com valores nulos, e ja seto conta dentro dos progressbars, para que sempre que eu entre naquela GUI eu veja os dados atualizados…porém pelo fato de estarem nulos, e a conta ser uma divisao, fica 0/0 e o java me da um erro:

Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: / by zero

Ué, mas então faça apenas o teste:

jProgressBar1.setValue(dados[8] == 0 ? 0 : (dados[1]*100)/dados[8]); 

[quote=ViniGodoy]Ué, mas então faça apenas o teste:

jProgressBar1.setValue(dados[8] == 0 ? 0 : (dados[1]*100)/dados[8]); 

Então Vini…fiz o teste e o programa iniciou perfeitamente, porém qdo chego no frame em que os jProgressBars devem mostrar a porcentagem, tudo fica 0%

sendo que no banco já possuem valores

Então sua query de soma não está funcionando. Claramente ela não está atualizando o elemento dados[8].

Axo que estou com erro no SELECT SUM…tem como vc dar uma olhada no ultimo código do meu post? que é do DAO, la tem uma query com SUM no MySQL, tem como ver se esta correto? por favor, obrigado!

E exatamente isso, agora que vi sua resposta…eu fiz um debug, e a query SUM esta com valor 0 no dados[8]

Engraçado, que fiz um teste, e mesmo setando um valor para dados[8](fiz o sum direto no MySQL e peguei o total e atribui no próprio código), os ProgressBars nao funcionaram como deviam.

dados[8]=26;

Da até pra mostra num tipo de teste de mesa:

dados[2]=6
dados[8]=26

dados[2]100/dados[8] -> 6100/26

valor do progressbar = 23%

será que é algum erro pelo fato de que o valor da progressbar é um inteiro, e qdo faço a divisão retorna um valor real 23,076923…

Não, o erro parece estar nos dados mesmo. Você tem certeza que esses arrays estão com os valores corretos?

Ou então, configure sua progressbar para ter os valores mínimos e máximos no que vc vai fornecer, e simplesmente forneça um valor dentro do intervalo.
O mínimo não precisa ser 0 e o máximo não precisa ser 100. Por exemplo, se vc tem 1500 registros, o minimo pode ser 0, o máximo 1500 e o valor pode ser o contador de registro.

boa ideia, vou tentar isso Vini.

Nunca teria pensado nisso

Então Vini, estou tentando fazer isso, mas nao estou conseguindo, eu já fiz um debug, e o banco esta me retornando corretamente os dados e etc…porém os ProgressBars não estão corretos, está estranho, de uma olhada nesses códigos:

DAO: (consulta a produção de cada integrante)

public void consultaProduçao(Admin.Admin_Producao frame)
    {
        Statement consulta;
        ResultSet retorno;
        String comando="SELECT * FROM producao";
        Conecta_BD.carregarDriver();
        Connection conn=Conecta_BD.carregarServidor();
        try
        {
            consulta=conn.createStatement();
            retorno=consulta.executeQuery(comando);
            while(retorno.next())
            {
                if(retorno.getString("admin").equals("admin"))
                {frame.ProgressBar_admin.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_cesar"))
                {frame.ProgressBar_cesar.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_felipe"))
                {frame.ProgressBar_felipe.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_giovanna"))
                {frame.ProgressBar_giovanna.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_giovanni"))
                {frame.ProgressBar_giovanni.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_guilherme"))
                {frame.ProgressBar_guilherme.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_jefferson"))
                {frame.ProgressBar_jefferson.setValue(retorno.getInt("dados_inseridos"));}
                if(retorno.getString("admin").equals("admin_yuri"))
                {frame.ProgressBar_yuri.setValue(retorno.getInt("dados_inseridos"));}
            }
        }
        catch(Exception e)
        {
            System.out.println("Erro: consultaProducao()"+e.getCause());
        }
    }

DAO: (consulta a soma de todos inserts feitos)

public int consultaTotalProdução()
    {
        Statement consulta;
        ResultSet retorno;
        String soma="SELECT SUM(dados_inseridos) AS total FROM producao";
        int total=0;
        Conecta_BD.carregarDriver();
        Connection conn=Conecta_BD.carregarServidor();
        try
        {
           consulta=conn.createStatement();
           retorno=consulta.executeQuery(soma);
           while(retorno.next())
           {
               total=retorno.getInt("total");
           }
        }
        catch(Exception e)
        {
            System.out.println(e.getCause());
        }
        return total;
    }

IF() de um método da classe que deixa o Frame dos ProgressBars visiveis:

if(String.valueOf(this.ComboBox_acoes.getSelectedItem()).equals("Porcentagem de Produção"))
        {
            Banco.Comandos_BD comandos=new Banco.Comandos_BD();
            comandos.consultaProduçao(frame_producao);
            frame_producao.setVisible(true);
            frame_producao.frameAnterior(this);
        }

e finalmente a class em que possui os ProgressBars(resumi em um progressbar de exempolo:

private javax.swing.JFrame frame_anterior;
private Banco.Comandos_BD comandos=new Banco.Comandos_BD();
....

ProgressBar_admin.setBackground(new java.awt.Color(255, 255, 255));
        ProgressBar_admin.setForeground(new java.awt.Color(153, 153, 255));
        ProgressBar_admin.setMaximum(comandos.consultaTotalProdução());
        ProgressBar_admin.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 2));
        ProgressBar_admin.setFocusable(false);
        ProgressBar_admin.setOpaque(true);
        ProgressBar_admin.setString(String.valueOf(this.ProgressBar_admin.getValue()));
        ProgressBar_admin.setStringPainted(true);
 ...

O que os progressbars deveriam mostrar, e o que estão mostrando?

Eles deveriam mostrar a qtde de inserts que cada admin fez em relação ao total…

como ninguem fez nenhum insert, somente eu mesmo, estou com 5 inserts de 5…meu progressbar fica certo(no máxim0) porem o texto dele fica “0”, e não “5”.

e desculpe pelo incomodo na MP

Consegui, eu estava usando o getValue dentro do setString antes de executar o comando no banco(que é disparado ao apertar um botão)…agora esta certo

Vini obrigado pela atenção, agora posso te pedir um conselho? esta num tópico meu que ninguem respondeu, mas pode dar uma olhada por favor?

http://www.guj.com.br/java/239701-estou-dentro-do-padrao-de-programacao#1236552

inclusive axo que pelo oq esta escrito nele explica algo que esta acontecendo no meu projeto, quando eu mando o netbeans executar o projeto principal, demora cerca de 15 segundos para abri o JFrame