webForumDet fria alternativet

Anropa värde från metod i annan klass

Java

6 svar · 823 visningar · startad av roblj689

Medlem sedan apr. 20066 inlägg
Frågan#1

Jag har suttit hela dan med att försöka klura ut det här :x
Skulle någon kunna vara snäll att hjälpa mig? :OO

I klassen SpelFrame hämtar jag värdet på det som skrivs in och lagras i variabeln temp. Den skickas till metoden AddTime i I klassen SimulateTime.

------------------------------------------------------------------
public void actionPerformed(ActionEvent e) {
Scanner sc = new Scanner((simulateBuffering.getText()));
int temp = (sc.nextInt());
tidBuffering.AddTime(temp);
}
------------------------------------------------------------------

SimulateTime
------------------------------------------------------------------
public void AddTime(int a){
tid = a;
}
------------------------------------------------------------------

Det är slutligen i klassen buffer jag vill anropa värdet i Tread.Sleep för att styra hur länge tråden ska sövas. Det är dock här det går snett och värdet på tid vill inte läsas.
------------------------------------------------------------------
public synchronized void put(Product product)
{
//SimulateTime tid = new SimulateTime(0);

while (this.bufferList.getListLength()>=4)
while (bufferList.isEmty())
try {Thread.Sleep(SimulateTime.tid);}
catch (InterruptedException e)
{
------------------------------------------------------------------

Medlem sedan maj 20018 027 inlägg
#2

Skapa en metod i SimulateTime som returnerar tiden. Då kan klassen buffer få tiden genom att anropa den metoden.

Medlem sedan apr. 20066 inlägg
#3

Ok, så här ser klassen SimulateTime ut nu:

----------------------------------------------
public class SimulateTime

{

public long tid;

public SimulateTime(long a) {}

public void AddTime(long a){
	tid = a;
	System.out.println(tid);}

public long getTime() { 
	System.out.println(tid);
	return tid; }

}
---------------------------------------------

Satte System.out.println(tid); för att se om något skrevs ut, men det gör det inte :( Inte heller sövs min tråd :x

Anropar med

---------------------------------------------------
public synchronized void put(Product product)
{
SimulateTime tid = new SimulateTime(0);

	while (this.bufferList.getListLength()\>=4)
    while (bufferList.isEmty())
    try {Thread.sleep(**tid.getTime()**);}
    catch (InterruptedException e)
    {

---------------------------------------------------

Medlem sedan maj 20018 027 inlägg
#4

Nu är jag inte särskilt bra på Java, men det skulle ju kunna vara så enkelt som att det blir en exception helt enkelt därför att du vill att tråden ska sova 0 ms. Hur som helst är det en meningslös instruktion, som jag förstår det.

Medlem sedan apr. 20066 inlägg
#5

try {Thread.Sleep(SimulateTime.tid);} ska hämta

tid från

public void AddTime(long a){
tid = a;
System.out.println(tid);}

där tid får värdet av a som i sin tur fås från temp

int temp = (sc.nextInt());
tidBuffering.AddTime(temp);

i klassen SpelFrame.

Raden
SimulateTime tid = new SimulateTime(0); initierar bara en ny instans av variabeln tid vilket väl måste sättas till något värde ( i detta fall 0) för att kunna skapas (kompileringsfel annars)?

Nån som har koll på varför tid inte innehåller något värde? :l

Medlem sedan sep. 2001961 inlägg
#6

Jo, det är helt korrekt att för att skapa en ny SimulateTid så skall du enligt konstruktorn skicka med en long. MEN denna sätter inte attributet tid utan ignoreras. Det betyder att tid inte sätts till något alls och du får ett runtime error av något slag eller ett rent skräpvärde. I din put-metod sätter du aldrig tid till något riktigt värde.

Som du skriver så gör raden SimulateTime tid = new SimulateTime(0); instansiera EN NY instans. Det är alltså inte samma instans som den du skapat i SpelFrame. Om du vill ha värdet från den SimulateTid-instansen så måste du skicka med den till sov-metoden.

F.ö. så säger kod-konventionen för java att metodnamn skall börja med en gemen.... Pörskans .NET-programmerare... ;-)

Medlem sedan juni 20008 205 inlägg
#7

En primitiv (som long) har alltid ett värde, för fält defaultar det till 0. Så om din applikation inte sover nånting finns två alternativ; att sleep aldrig anropas eller att programmet ombeds sova med 0 eller något värde som är för lågt för att märkas. Om du har gjort en debugutskrift som aldrig skrivs ut torde det betyda att koden aldrig anropas. Lösning: Gör fler debugutskrifter som visar var koden slutar gå som den borde.

262 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)