Problema com a importação de uma classe dentro do public static void main

30 respostas
E

Boa tarde pessoal, tenho um código que segue abaixo e estou com uma dúvida(problema):

package xyseries;

/*
 *
 * @author eduardoesn
 */
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import lertxt.LerTxt;

public class XYSeriesDemo extends ApplicationFrame {

    private Object br;
    static XYSeries series;

    public void LerTxt() throws IOException {
        series = new XYSeries("Velocidade do vento");
        FileReader reader = new FileReader("log.txt");
        BufferedReader br = new BufferedReader(reader);
        String linha;
        while ((linha = br.readLine()) != null);
        String[] items = linha.split(",");

        if (items.length > 1 && items[0].equals("104")) {
            int x = IntegerparseInt(items[3]);
            int y = IntegerparseInt(items[4]);
            series.add(x, y);
        }

        try {
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    public int IntegerparseInt(String string) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public XYSeriesDemo(final String title, XYSeries dados) {

        super(title);

        //XYSeries series = new XYSeries("Velocidade do vento");
        //series.add(x, y);
        //series.add(4.0, -0.785);
        //series.add(2.5, 90.0);
        //series.add(5.0, -105.0);
        //series.add(8.7, 150.0);
        //series.add(10.0,101.0);
        //series.add(11.0, 100.0);
        final XYSeriesCollection data = new XYSeriesCollection(dados);
        final JFreeChart chart = ChartFactory.createXYLineChart("Anemômetro",
                "Data", "m/s",
                data, PlotOrientation.VERTICAL, true, true, false);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(1000, 400));
        setContentPane(chartPanel);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(final String[] args) {
        
        LerTxt();
        final XYSeriesDemo demo = new XYSeriesDemo("Gráfico Modelo", series);
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

O meu problema é o seguinte: preciso chamar a função LerTxt para adicionar valores na variável series e plotar o gráfico.
Não estou conseguindo chamar esta função dentro do public static void main.
Alguém poderia me ajudar?
Obrigado
Eduardo

30 Respostas

T

LerTxt é um método que requer um objeto da classe XYSeriesDemo - no seu caso, você poderia usar “demo.LerTxt()”.

Se esse método tivesse sido declarado como “static” ele não iria requerer um objeto para ser executado.

E

o quer dizer este erro?

Exception in thread “main” java.lang.NullPointerException

T

É que você tem de chamar “demo.LerTxt” depois de inicializar a variável “demo”, não antes, senão vai encontrar esse maldito “NullPointerException”.

E

certo, mas não estou conseguindo chamar este “demo.LerTxt”, não estou sabendo em que parte do código colocar.
Ta dando o mesmo erro sempre.

Eu tenho que acrescentar apenas isto ou preciso fazer alguma modificação no código?

T

Troque as linhas 79 e 80 de lugar e veja o que ocorre.

E

corrigindo.
trocando as linhas que vc disse…
acontece a mesma coisa, dá o NullPointerException

lina

Oi,

Amigo, tem certeza que você fez esse código ? estranho que você não sabe o que é NullPointerException.

Conforme o thingol disse:

final XYSeriesDemo demo = new XYSeriesDemo("Gráfico Modelo", series); demo.LerTxt();

Tchauzin!

E

eu fiz com um camarada junto aqui do laboratório, eu não conhecia o java, e foi passado pra mim que eu teria q fazer um programa em java q tivesse esta função (ler e plotar) entao comecei a correr atrás.

ou seja, estou começando a trabalhar com java agora, um mês e pouquinho…

lina

Oi,

Você fez o que eu coloquei no comentario anterior ?

Tchauzin!

E

fiz… do jeito q vc falou…
e cotinua dando a mesma coisa.

lina

Oi,

fiz aqui e funcionou… estranho!
Coloque seu código aqui novamente.

Tchauzin!

E
package xyseries;

/*
*
* @author eduardoesn
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import lertxt.LerTxt;

public class XYSeriesDemo extends ApplicationFrame {

    private Object br;
    static XYSeries series;

    public void LerTxt() throws IOException {
        series = new XYSeries("Velocidade do vento");
        FileReader reader = new FileReader("log.txt");
        BufferedReader br = new BufferedReader(reader);
        String linha;
        while ((linha = br.readLine()) != null);
        String[] items = linha.split(",");

        if (items.length > 1 && items[0].equals("104")) {
            int x = IntegerparseInt(items[3]);
            int y = IntegerparseInt(items[4]);
            series.add(x, y);
        }

        try {
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    public int IntegerparseInt(String string) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public XYSeriesDemo(final String title, XYSeries dados) {

        super(title);

        //XYSeries series = new XYSeries("Velocidade do vento");
        //series.add(x, y);
        //series.add(4.0, -0.785);
        //series.add(2.5, 90.0);
        //series.add(5.0, -105.0);
        //series.add(8.7, 150.0);
        //series.add(10.0,101.0);
        //series.add(11.0, 100.0);
        final XYSeriesCollection data = new XYSeriesCollection(dados);
        final JFreeChart chart = ChartFactory.createXYLineChart("Anemômetro",
                "Data", "m/s",
                data, PlotOrientation.VERTICAL, true, true, false);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(1000, 400));
        setContentPane(chartPanel);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(final String[] args) throws IOException {


        final XYSeriesDemo demo = new XYSeriesDemo("Gráfico Modelo", series);
        demo.LerTxt();
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}
Roger75

Importe o projeto dentro do Eclipse e debugue o código. Ou então veja a mensagem de erro inteira que aparece no DOS, para ter uma idéia do que pode estar causando NullPointer.

E

roger75

a msg completa q aparece é esta

run:

Exception in thread main java.lang.NullPointerException

at xyseries.XYSeriesDemo.LerTxt(XYSeriesDemo.java:33)

at xyseries.XYSeriesDemo.main(XYSeriesDemo.java:81)

Java Result: 1
B

eduardoesn, você sabe o que é um NullPointerException?

Eles acontecem quando você tem um objeto nulo e quer acessar qualquer coisa dentro dele. Um exemplo

String s = "Grupo de Usuários Java";
int tamanho = s.length(); // funciona

String s2 = null;
int tamanho2 = s2.length(); // s2.length() gera um NPE pois s2 é nulo
Roger75

eduardoesn:
roger75

a msg completa q aparece é esta

run:

Exception in thread main java.lang.NullPointerException

at xyseries.XYSeriesDemo.LerTxt(XYSeriesDemo.java:33)

at xyseries.XYSeriesDemo.main(XYSeriesDemo.java:81)

Java Result: 1

</blockquote>

while ((linha = br.readLine()) != null); String[] items = linha.split(",");

No fim da linha do “while” acho que não tem esse ponto e vírgula. Acho que você queria que “items” ficasse dentro do “while”, não?

E

é isso que eu quero roger, mas quando eu tiro o “;”, começa a dar uma série de erros.
O que nao estou conseguindo fazer é o que o Bruno Laturner falou.

Não tem nd dentro do objeto.

smarcelo_br

Ocorre outros erros, provavelmente, porque a declaração da variável ‘items’ deve estar fora do bloco do while. Tente assim:

String linha;  
String[] items;
while ((linha = br.readLine()) != null) 
    items = linha.split(",");

Talvez vc precise iniciar a ‘items’ com algum valor padrão para não dar falhas caso o arquivo esteja vazio.

[]s
Sergio Marcelo

E

marcelo é extamente isso q da acusando
que a variável items provavelmente nao foi inicializada

aí eu segui a opção dele de inicializar a variável, e ele fez String[] items = null;

porém o programa roda, mas não aparece gráfico. abre somente uma tela com os eixos, uns valores quaisquer nos eixos e sem linha d gráfico.

E

mandei depurar o projeto e aparexeu a seguinte msg:

Ouvindo em javadebug
Executando programa do usuário
Depurador interrompido em código-fonte não compilável.
Thread main parada em XYSeriesDemo.java:37.

o que siginifica?

smarcelo_br

Você colocou o ponto (.) entre a classe Integer e o metodo parseInt(…)?

Como está na primeira mensagem:

int x = IntegerparseInt(items[3]);

Correto:

int x = Integer.parseInt(items[3]);

Se não, dá erro de compilação e não é possível depurar. É isso?

E

com a inclusõ do “.” deu mais um mont d erros

estes:

Exception in thread main java.lang.NumberFormatException: For input string: 3.251

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)

at java.lang.Integer.parseInt(Integer.java:456)

at java.lang.Integer.parseInt(Integer.java:497)

at xyseries.XYSeriesDemo.LerTxt(XYSeriesDemo.java:38)

at xyseries.XYSeriesDemo.main(XYSeriesDemo.java:82)

Java Result: 1
smarcelo_br

O erro ocorre, pois, o número “3.251” não faz parte do conjunto dos Inteiros e o seu código está usando “Integer.parseInt(…)”. Este número pertence ao conjunto dos números reais.

Hehehe, quem foi que disse que aquelas aulas da 5a. série sobre conjuntos não serviam para nada?

Em Java, números reais são representados pelo tipo primitivo ‘double’.

double x = Double.parseDouble(items[3]);

Observando melhor o seu código percebi que você deseja adicionar em ‘series’ todos os pontos lidos no arquivo ‘log.txt’.
Olha o que está acontecendo:

//(...)
String[] items = null;
while ((linha = br.readLine()) != null) // Enquanto não chegar ao fim do arquivo 'log.txt' (...)
	items = linha.split(",");  // (...) execute apenas esta linha!
   
   /* neste ponto, o array de String 'items' 
     tem o resultado da última linha do arquivo! */
	
	if (items.length > 1 && items[0].equals("104")) {  
		double x = Double.parseDouble(items[3]);   // lendo o 'x' da última linha
		double y = Double.parseDouble(items[4]);   // lendo o 'y' da última linha
		series.add(x, y);
	}  // fim do bloco if

//(...)

Ou seja, você deve criar um bloco (’{’ e ‘}’) para o comando ‘while’ . Você também pode manter a declaração da variável ‘items’ dentro do bloco while, pois, esta variável não precisa ser usada fora deste.

Olha como fica com a inclusão do bloco do ‘while’:

while ((linha = br.readLine()) != null) {  // inicio do bloco while
    /* A variável 'items' pode ser 
	  somente declarada aqui, pois, 
	  esta não é usada fora do bloco do 'while'. */
	  
	String[] items = linha.split(",");    
   
    /* Como os comandos abaixo estão dentro do bloco do 
	while, serão adicionados os números x e y para todas as
	linhas do arquivo. */
	
	if (items.length > 1 && items[0].equals("104")) {  
		double x = Double.parseDouble(items[3]);  
		double y = Double.parseDouble(items[4]);  
		series.add(x, y); 
	}  // fim do bloco if

}  // fim do bloco while

Consultei o site http://www.jfree.org/jfreechart/api/gjdoc/org/jfree/data/xy/XYSeries.html e para sua sorte, existe um metodo add(double, double) para a classe XYSeries. Isto é, você não precisará converter o número lido do arquivo para o tipo ‘int’.

Boa sorte.

E

boa tarde… fiz tds as alterações sugeridas… e não deu mais erro.
porém desconfio que os valores nao estao sendo armazenados nas variáveis x e y, pois o gráfico aparece vazio…

o que está acontecendo?

B

eduardoesn:
boa tarde… fiz tds as alterações sugeridas… e não deu mais erro.
porém desconfio que os valores nao estao sendo armazenados nas variáveis x e y, pois o gráfico aparece vazio…

o que está acontecendo?

Não desconfie de nada, use o debugador da IDE e veja você mesmo o que está acontecendo com as variáveis.

smarcelo_br

Agora não consigo mais imaginar nada de errado no código. Você deve verificar o conteúdo do log.txt (lembre-se que o aplicativo só pega os valores das linhas que começam com a string ‘104’).

Nunca mexi com o JFreeChart. Pode ser que tenha algum problema no uso desta biblioteca.

O melhor mesmo é depurar a aplicação e inspecionar o que está sendo passado para o método ‘series.add()’.

E

eu mando depurar a aplixação, porém ele nao mostra msg alguma, pelo contrário, roda o programa sem carregar as variáveis e plotar no gráfico.

a única msg q ele me mostra é:
“executando programa do usuário”

T

Em vez de rodar seu programa dando um duplo-clique no JAR (isso chama o javaw, e as mensagens de erro vão para o lixo), rode manualmente seu programa em um Prompt de Comando, usando o java.exe.
Aí você vai ver todas aquelas mensagens de erro (stack traces e outras tranqueiras) que aparecem durante a execução do programa.

A dica é você reconfigurar o “tamanho de buffer de tela” do Prompt de Comando para que ele guarde mais linhas que as 300 que são default. Eu costumo deixar em 1024.

Para você fazer isso, clique com o botão esquerdo no menu de sistema do Prompt de Comando, e escolha a opção Propriedades. Então procure a aba Layout, acerte o “Tamanho de Buffer de Tela” para Altura = 1024, e então clique em OK. Eu recomendo, ao clicar novamente OK, alterar a opção para “(.) Modificar o atalho que iniciou esta janela”, pra você não ter de ficar reconfigurando isso toda hora.

E
andei fazendo umas modificações em meu código e descobri uma coisa. o problema nao está nas variáveis (dadosx e dadosy) que gravo os valores. quando mando imprimir só as variáveis, elas me mostram os valores corretos. O problema está em carregar estas variáveis como par ordenado (x, y).
if (items.length > 1 && items[0].equals("104")) {
           double dadosx = Double.parseDouble(items[3]);
           double dadosy = Double.parseDouble(items[4]);
           series.add(dadosx, dadosy);
           System.out.println(dadosx);
           System.out.println(dadosy);
           
        }
neste pedaço do código quando dou o comando
System.out.println(series);
ele me retorna umas coisas completamentes estranhas.. tipo:

org.jfree.data.xy.XYSeries@47e8d656
org.jfree.data.xy.XYSeries@47e8d656
org.jfree.data.xy.XYSeries@a4aba1da
org.jfree.data.xy.XYSeries@a4aba1da
org.jfree.data.xy.XYSeries@e83bb265
org.jfree.data.xy.XYSeries@e83bb265

sinceramente não sei o q significa isto.
alguém sabe?

smarcelo_br

O comando ‘System.Out.println(series);’ apresenta o nome da classe e o id da instância ‘series’. Para você consultar os valores (x,y) que você adicionou em ‘series’, você precisa usar os metodos getItemCount(), getX() e getY(). Por exemplo:

int ind; for (ind=0; ind<series.getItemCount(); ind++) { System.out.print(ind); System.out.print(" - X="); System.out.print(series.getX(ind)); System.out.print(" Y="); System.out.print(series.getY(ind)); }

Criado 12 de março de 2009
Ultima resposta 30 de mar. de 2009
Respostas 30
Participantes 6