> > 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