[Resolvido] Métodos Estáticos

17 respostas
Yago_Ernandes

Eu to fazendo um programa de ponto eletônico e to com várias dúvidas, mas a principal é a seguinte: Eu tento colocar um trecho de código dentro do main mas ele da erro pois o trecho não é estático, e eu não sei como devo fazer, esta é a linha que da erro:

(t[i] = new clientThread(clientSocket,t)).start();

onde:

static  clientThread t[] = new clientThread[10];

e o clientThread é:

class clientThread extends Thread{
    
    DataInputStream is = null;
    PrintStream os = null;
    Socket clientSocket = null;       
    clientThread t[];
    
    public clientThread(Socket clientSocket, clientThread[] t){
	this.clientSocket=clientSocket;
        this.t=t;
    }
    
    public void run(){
        
	String line;
        String name;
	try{
	    is = new DataInputStream(clientSocket.getInputStream());
	    os = new PrintStream(clientSocket.getOutputStream());
	    os.println("Digite seu nome:");
            System.out.println("Cliente se conectando...");
	    name = is.readLine();
	    os.println("Olá "+name+", bem vindo ao chat.\nPara sair, digite /quit em uma nova linha");
	    System.out.println("Cliente conectado! Nome utilizado: "+name);
	    for(int i=0; i<=9; i++)
		if (t[i]!=null && t[i]!=this)  
		    t[i].os.println("*** Um novo usuário, "+name+", entrou na sala ***" );
	    while (true) {
		line = is.readLine();
                if(line.startsWith("/quit")) break; 
		for(int i=0; i<=9; i++)
		    if (t[i]!=null)  t[i].os.println("<"+name+"> "+line); 
	    }
	    for(int i=0; i<=9; i++)
		if (t[i]!=null && t[i]!=this)  
		    t[i].os.println("*** O usuário "+name+" esta saindo da sala ***" );
	    
	    os.println("*** Tchau "+name+", volte sempre ***"); 

	    // Clean up:
	    // Set to null the current thread variable such that other client could
	    // be accepted by the server

	    for(int i=0; i<=9; i++)
		if (t[i]==this) t[i]=null;  
		
	    // close the output stream
	    // close the input stream
	    // close the socket
	    
	    is.close();
	    os.close();
	    clientSocket.close();
	}
	catch(IOException e){};
    }
}

17 Respostas

Yago_Ernandes

Alguém pode me dar uma dica de como resolver? Pois preciso entregar esse projeto na quarta feira…

matheuslmota

Não declare t como estático, declare-o assim:

clientThread t[] = new clientThread[10];

Além do mais, a classe clientThread não foi declarada como pública, o que faz com que ela esteja acessível somente dentro do pacote em que ela foi declarada. Declare essa classe como pública, para evitar dores de cabeça.

Yago_Ernandes

Se eu não declarar t como estático, ele da erro em todas as menções da variavel…

Eu fiz da seguinte forma: deixei t como estático, declarei a classe clientThread como publica como você disse e tambem estática…

Os erros anteriores sumiram, mas agora eu não posso usar o comando .append() que é essencial no meu programa, alguma sugestão?

matheuslmota

Yago Ernandes:
Se eu não declarar t como estático, ele da erro em todas as menções da variavel…

Eu fiz da seguinte forma: deixei t como estático, declarei a classe clientThread como publica como você disse e tambem estática…

Os erros anteriores sumiram, mas agora eu não posso usar o comando .append() que é essencial no meu programa, alguma sugestão?

Você deve estar fazendo alguma salada. Primeiro, não declare a classe como estática. Segundo, se você precisou declarar t como estático, é sinail de que o(s) método(s) que chama(m) t é(são) estático(s). Não delcare métodos como estáticos, à menos que seja realmente preciso.

Yago_Ernandes

o método que chama t é o:

public static void main(String args[])

ou seja, ele é estático. Enquanto a classe, quando eu a declarei como estática, o programa rodou perfeitamente com o System.out.println(), mas queria que ele aparecesse na TextArea com o comando .append(), porque não pode declará-la como estática?

matheuslmota

Yago Ernandes:
o método que chama t é o:

public static void main(String args[])

ou seja, ele é estático. Enquanto a classe, quando eu a declarei como estática, o programa rodou perfeitamente com o System.out.println(), mas queria que ele aparecesse na TextArea com o comando .append(), porque não pode declará-la como estática?


Hora, então faça mais fácil. Primeiramente não declare a classe clientThread como estática. Depois, basta declarar o vetor t dentro do próprio método main:

public static void main(String args[]) { clientThread t[] = new clientThread[10]; }

Yago_Ernandes

mas a classe clientThread também é chamada dentro do método main, o que devo fazer quanto a ela se não é aconselhável declará-la como estática?

Yago_Ernandes

Ah, o vetor t não deu mais problema declarando-o dentro da main(), muito obrigado, mas a classe sim

matheuslmota

Declare a variável normalmente. Quando você faz

public static void main(String args[]) { clientThread t[] = new clientThread[10]; }

não precisa declarar a classe clientThread como estática.

Yago_Ernandes

Se eu não declará-la, a mesma linha da erro…

matheuslmota

Poste a declaração com erro.

Yago_Ernandes

Linha que da erro:

(t[i] = new clientThread(clientSocket, t)).start();

erro:

non-static variable this cannot be referenced from a static context

Yago_Ernandes

o vetor t que eu declarei denbtro da main, não me deu mais problemas, mas ela precisa ser instanciada com a classe clientThread, e é esse o problema

ErickRAR

Um método não estático não pode ser utilizado dentro de um estático sem a classe ter sido instanciada. Agora uma método estático pode ser acessado.
Para acessar um metodo ou atributo ou estatico de uma classe, tem que instanciar primeiro.

Yago_Ernandes

mas nesse caso, como eu instanciaria essa classe? Eu tentei aqui e não consegui :cry:

ErickRAR
ClientThread client = new  ClientThread(socket, clientThread[]);
client.getATributoQueVoceQuer();
//ou
client.atributo;

http://pt.wikibooks.org/wiki/Java/Modificadores
http://www.guj.com.br/articles/121

Esses links irão te ajudar no restante.

Yago_Ernandes

Eu agradeço a ajuda de todos, ainda não consegui mas vou dar uma lida nos links que o ErickRAR me passou, obrigado.

Criado 24 de junho de 2012
Ultima resposta 24 de jun. de 2012
Respostas 17
Participantes 3