/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Overførsel af object mellem main-code og t~
Fra : Kasper Johansen


Dato : 01-09-05 14:01

Hej gruppe.

Når jeg starter en ny tråd, kan jeg ikke få et socket-element med over i
tråden.

Hvordan gøres dette?

Indtil videre ser min kode således ud:


<java>
import java.io.*;
import java.net.*;

public class main{
public static void main (String [] args) throws IOException{
ServerSocket mysocket = null;
Socket clientsocket = null;

try{
mysocket = new ServerSocket(4052);
System.err.println("Test");

while(true){
try{
clientsocket = mysocket.accept();
System.err.println("INCOMMING!!!");

Thread t1 = new Thread(){
public void run(){
String inputLine;
BufferedReader in = new BufferedReader(new
InputStreamReader(clientsocket.getInputStream()));

while((inputLine = in.readLine()) != null){
System.err.println(inputLine);
}

System.err.println("Test");
}
};
}catch(IOException e){
System.err.println("Accept failed!");
}
}

// Bruges kun hvis vi er en klient.
//}catch(UnknownHostException e){
// System.err.println("Unknown host");
}catch(IOException e){
System.err.println("Could not accept connection.");
}
}
}
</java>


Jeg får fejlen:

<error>
D:\Java\Testapp\main.java:21: local variable clientsocket is accessed from
within inner class; needs to be declared final
BufferedReader in = new BufferedReader(new
InputStreamReader(clientsocket.getInputStream()));

^
1 error
</error>


Er der nogen der ved dette, eller kan hjælpe mig på spor af en løsning?

--
Mvh Kasper Johansen



 
 
Mikael Flensborg (01-09-2005)
Kommentar
Fra : Mikael Flensborg


Dato : 01-09-05 14:49

Kasper Johansen wrote:
> Hej gruppe.
>
> Når jeg starter en ny tråd, kan jeg ikke få et socket-element med over i
> tråden.
>
> Hvordan gøres dette?
>
> Indtil videre ser min kode således ud:
>
>
> <java>
> import java.io.*;
> import java.net.*;
>
> public class main{
> public static void main (String [] args) throws IOException{
> ServerSocket mysocket = null;
> Socket clientsocket = null;
>
> try{
> mysocket = new ServerSocket(4052);
> System.err.println("Test");
>
> while(true){
> try{
> clientsocket = mysocket.accept();
> System.err.println("INCOMMING!!!");
>
> Thread t1 = new Thread(){
> public void run(){
> String inputLine;
> BufferedReader in = new BufferedReader(new
> InputStreamReader(clientsocket.getInputStream()));
>
> while((inputLine = in.readLine()) != null){
> System.err.println(inputLine);
> }
>
> System.err.println("Test");
> }
> };
> }catch(IOException e){
> System.err.println("Accept failed!");
> }
> }
>
> // Bruges kun hvis vi er en klient.
> //}catch(UnknownHostException e){
> // System.err.println("Unknown host");
> }catch(IOException e){
> System.err.println("Could not accept connection.");
> }
> }
> }
> </java>
>
>
> Jeg får fejlen:
>
> <error>
> D:\Java\Testapp\main.java:21: local variable clientsocket is accessed from
> within inner class; needs to be declared final
> BufferedReader in = new BufferedReader(new
> InputStreamReader(clientsocket.getInputStream()));
>
> ^
> 1 error
> </error>
>
>
> Er der nogen der ved dette, eller kan hjælpe mig på spor af en løsning?
>
Din Thread er en inder klasse. Din clientsocket er defineret i yder
klassen. Det der sker når du erklærer din t1, er at yderklassens felters
referencer overførers til din inderklasses scope. Så hvad ville der
ske, hvis du senere nede i din kode skrev "clientSocket = new....."..
Nemlig, dit inderklasse object ville referere til et "dødt" objekt (idet
det jo stadig refererer til den gamle clientSocket. For at forhindre
denne ubehagelige situation kræver java således at du erklærer din
clientSocket "final". Så er du så om sige beskyttet mod digselv

/Mikael

Kasper Johansen (01-09-2005)
Kommentar
Fra : Kasper Johansen


Dato : 01-09-05 15:53

"Mikael Flensborg" <mflensborg@clcbio.com> skrev i en meddelelse
news:df70sv$df2$1@news.net.uni-c.dk...
> For at forhindre denne ubehagelige situation kræver java således at du
> erklærer din clientSocket "final". Så er du så om sige beskyttet mod
> digselv

Hvordan eklærer jeg så min clientsocket som final?

Skal det gøres så snart jeg sætter min clientsocket, eller først inde i
tråden?

Ja du må undskylde, men jeg kan ikke helt følge med :)

--
Mvh Kasper Johansen



Kasper Johansen (01-09-2005)
Kommentar
Fra : Kasper Johansen


Dato : 01-09-05 16:01

"Kasper Johansen" <kasper@johansen.tdcadsl.dk> skrev i en meddelelse
news:431714f6$0$11671$ba624c82@nntp02.dk.telia.net...
> "Mikael Flensborg" <mflensborg@clcbio.com> skrev i en meddelelse
> news:df70sv$df2$1@news.net.uni-c.dk...
>> For at forhindre denne ubehagelige situation kræver java således at du
>> erklærer din clientSocket "final". Så er du så om sige beskyttet mod
>> digselv
>
> Hvordan eklærer jeg så min clientsocket som final?
>
> Skal det gøres så snart jeg sætter min clientsocket, eller først inde i
> tråden?
>
> Ja du må undskylde, men jeg kan ikke helt følge med :)

Jeg kom selv frem til følgende:

<java>
while(true){
try{
final Socket clientsocket = mysocket.accept();
System.err.println("INCOMMING!!!");

Thread t1 = new Thread(){
public void run(){
System.err.println("Tråd startet");

String inputLine;

try{
BufferedReader in = new BufferedReader(new
InputStreamReader(clientsocket.getInputStream()));
}finally{
System.err.println("Hejsa");
};

while((inputLine = in.readLine()) != null){
System.err.println(inputLine);
}

System.err.println("Test");
}
};

t1.start();
}catch(IOException e){
System.err.println("Accept failed!");
}
}
</java>


Det giver mig dog følgende fejl i min while:

<error>
D:\Java\Testapp\main.java:30: cannot find symbol
symbol: variable in
while((inputLine = in.readLine()) != null){
^
1 error
</error>


Hvorfor virker mit "in" ikke længere?

--
Mvh Kasper Johansen



Thomas Bendsen (01-09-2005)
Kommentar
Fra : Thomas Bendsen


Dato : 01-09-05 18:32

Kasper Johansen wrote:

>
> <java>
> while(true){
> try{
> final Socket clientsocket = mysocket.accept();
> System.err.println("INCOMMING!!!");
>
> Thread t1 = new Thread(){
> public void run(){
> System.err.println("Tråd startet");
>
> String inputLine;
>
> try{
> BufferedReader in = new BufferedReader(new
> InputStreamReader(clientsocket.getInputStream()));
> }finally{
> System.err.println("Hejsa");
> };
>
> while((inputLine = in.readLine()) != null){
> System.err.println(inputLine);
> }
>
> System.err.println("Test");
> }
> };
>
> t1.start();
> }catch(IOException e){
> System.err.println("Accept failed!");
> }
> }
> </java>
>
>
> Det giver mig dog følgende fejl i min while:
>
> <error>
> D:\Java\Testapp\main.java:30: cannot find symbol
> symbol: variable in
> while((inputLine = in.readLine()) != null){
> ^
> 1 error
> </error>
>
>
> Hvorfor virker mit "in" ikke længere?
>


Vel sagtens fordi din try{} blok definerer et "scope" eller hvad det nu
hedder på dansk. Dvs. at når du erklærer "in" i try-blokken så kan den
ikke tilgås udenfor. Du kan altså enten flytte alle referencer til "in"
ind i try-blokken, eller også kan du erklære "in" inden try-blokken
(dette kan jo godt gøres selv om du først initialiserer "in" inde i
try-blokken).
MVH Thomas Bendsen

Niels Dybdahl (02-09-2005)
Kommentar
Fra : Niels Dybdahl


Dato : 02-09-05 08:32

> > public class main{
> > public static void main (String [] args) throws IOException{
> > ServerSocket mysocket = null;
> > Socket clientsocket = null;
> >
> > try{
> > mysocket = new ServerSocket(4052);
> > System.err.println("Test");
> >
> > while(true){
> > try{
> > clientsocket = mysocket.accept();
> > System.err.println("INCOMMING!!!");
> >
> > Thread t1 = new Thread(){
> > public void run(){
> > String inputLine;
> > BufferedReader in = new BufferedReader(new
> > InputStreamReader(clientsocket.getInputStream()));
> >
> > while((inputLine = in.readLine()) != null){
> > System.err.println(inputLine);
> > }
> >
> > System.err.println("Test");
> > }
> > };
> > }catch(IOException e){
> > System.err.println("Accept failed!");
> > }
> > }
> >
> > // Bruges kun hvis vi er en klient.
> > //}catch(UnknownHostException e){
> > // System.err.println("Unknown host");
> > }catch(IOException e){
> > System.err.println("Could not accept connection.");
> > }
> > }
> > }
> > </java>
> >
> >
> > Jeg får fejlen:
> >
> > <error>
> > D:\Java\Testapp\main.java:21: local variable clientsocket is accessed
from
> > within inner class; needs to be declared final
> > BufferedReader in = new BufferedReader(new
> > InputStreamReader(clientsocket.getInputStream()));
> >
> > ^
> > 1 error
> > </error>
> >
> >
> > Er der nogen der ved dette, eller kan hjælpe mig på spor af en løsning?
> >
> Din Thread er en inder klasse. Din clientsocket er defineret i yder
> klassen.

Ikke korrekt. Den er defineret i main funktionen.

> Det der sker når du erklærer din t1, er at yderklassens felters
> referencer overførers til din inderklasses scope. Så hvad ville der
> ske, hvis du senere nede i din kode skrev "clientSocket = new....."..
> Nemlig, dit inderklasse object ville referere til et "dødt" objekt

No problem. Så længe der bare er en som refererer til objektet, er det ikke
dødt. Men en indre klasse ville heller ikke referere direkte til
yderklassens medlemmer. Den refererer indirekte via et link til yderklassen.

> (idet
> det jo stadig refererer til den gamle clientSocket. For at forhindre
> denne ubehagelige situation kræver java således at du erklærer din
> clientSocket "final". Så er du så om sige beskyttet mod digselv

Problemet ligger i at main funktionen afslutter på et tidspunkt (og class
main er ikke nødvendigvis programmets hovedklasse så programmet kan godt
fortsætte). Dermed forsvinder referencen til dens lokale variable og det er
uklart hvilken værdi den indre klasse skal referere til undtagen hvis
variablen var final og dermed kun har haft én værdi.

Niels Dybdahl



Søg
Reklame
Statistik
Spørgsmål : 177449
Tips : 31962
Nyheder : 719565
Indlæg : 6408120
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste