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]=newclientThread(clientSocket,t)).start();
onde:
static clientThread t[] = new clientThread[10];
e o clientThread é:
classclientThreadextendsThread{DataInputStreamis=null;PrintStreamos=null;SocketclientSocket=null;clientThreadt[];publicclientThread(SocketclientSocket,clientThread[]t){this.clientSocket=clientSocket;this.t=t;}publicvoidrun(){Stringline;Stringname;try{is=newDataInputStream(clientSocket.getInputStream());os=newPrintStream(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(inti=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(inti=0;i<=9;i++)if(t[i]!=null)t[i].os.println("<"+name+"> "+line);}for(inti=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 serverfor(inti=0;i<=9;i++)if(t[i]==this)t[i]=null;// close the output stream// close the input stream// close the socketis.close();os.close();clientSocket.close();}catch(IOExceptione){};}}
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:
publicstaticvoidmain(Stringargs[])
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:
publicstaticvoidmain(Stringargs[])
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]=newclientThread(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
ErickRAR
ClientThread client = new ClientThread(socket, clientThread[]);
client.getATributoQueVoceQuer();
//ou
client.atributo;