PDA

View Full Version : سوال: مشکل در گرفتن مقدار از متدی در یک کلاس دیگر جهت نمایش مقدار



pro_mvb
چهارشنبه 27 دی 1391, 17:05 عصر
سلام
من میخوام یک ArrayList رو که در یک کلاس به نام Inputer و در یک متد return شده رو در یک کلاس دیگه از طریق متد مربوطش چاپ کنم اما مشکل اینجاست که انگار مقدار متد به متغیر ArrayList من انتقال داده نمیشه!

این نحوه کد اشتباس؟

ArrayList arr=inputer.print();

من در اون کلاسی که ArrayList خودمو return کردم به متد print ، چک کردم و دیدم return انجام میشه.
منتهی نمیدونم چرا در سمت class Inputer متغیرم مقدار متد رو نمیگیره!

spiderman200700
چهارشنبه 27 دی 1391, 17:30 عصر
باید متد print رو هم دید. و اگه امکان داره جایی که شی inputer رو ایجاد کردی

pro_mvb
چهارشنبه 27 دی 1391, 20:51 عصر
اینجا شی Inputer ایجاد شده و استفاده شده :

private void b1ActionPerformed(java.awt.event.ActionEvent evt) {
Jclient client=new Jclient();
client.mains();
client.writer(t1.getText());

ClientInput inclient=new ClientInput();
arr=inclient.print();
StringBuilder sb=new StringBuilder();
if(!arr.isEmpty()){
jLabel1.setText("Empty");
}



/* for(int i=0;i<arr.size();i++){
sb.append(arr.get(i));
System.out.println(sb+"\n");
// jLabel1.setText(sb.toString());
}*/


}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new Client().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton b1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTree jTree1;
private javax.swing.JTextField t1;
// End of variables declaration
}




اینم نحوه مقدار دهی متد print:

try{
InputStream is=server_socket.getInputStream();
ObjectInputStream objin=new ObjectInputStream(is);

int c;
int counter;
boolean flag=true;
arr=(ArrayList) objin.readObject();

while(flag==true){
for(int i=0;i<arr.size();i++){
if(arr.get(i).equals("bastani")){
flag=false;
System.out.println("bastani peyda shod :D");
}
}
}

is.close();
server_socket.close();
objin.close();

}catch(Exception e){
e.printStackTrace();
}

}
public ArrayList print(){
return arr;
}

}



این بگم که متد print در یک کلاس دیگه صدا زده میشه تا کار return رو انجام بشه. ( که تست کردم انجام میده ! و مشکلی نداره)

spiderman200700
چهارشنبه 27 دی 1391, 21:41 عصر
این خطوطی که قبل از print گذاشتی (همین مقدار دهی به ArrayList) ، توی کانسترکتور هستش؟
اگه توی کانسترکتور نیست ، احتمالا مشکل همینه.
به هر حال من فکر میکنم مشکل اینه که قبل از اینکه ArrayList مقداردهی بشه ، این خط
arr=inclient.print();
اجرا میشه.

باید مطمئن بشی که ArrayListمقدارشو بگیره بعد متد print رو فراخوانی کنی.
در ضمن اسم متد print به getArray تغییر کنه زیباتره.

pro_mvb
چهارشنبه 27 دی 1391, 22:10 عصر
نه در واقع یع کلاس ListenerHandler هست که در متد Run از این کلاس استاده شده و متد های print و do (قسمتهای بالای کد print در متدی به نام do هست) رو صدا میزنه و کار انجام میشه.
من یه بار اومدم در متد PRINT یه حفقه گذاشتم و درونش arr رو خوندم و نمایش داد. پس وقتی return کردم باید بشه دیگه.

spiderman200700
چهارشنبه 27 دی 1391, 23:11 عصر
راستش چون همه ی کد رو ندیدم نمیدونم باید چی بگم.
ولی حالا که میگی این خط
arr=(ArrayList) objin.readObject();
داخل یه Listener اجرا میشه، باید بگم که تا وقتی event مربوط به Listener اتفاق نیفته، کد های داخل متد اجرایی Listener اجرا نمیشه ، پس arr هم وقتی متد print رو صدا میزنی هیچ مقداری نخواهد داشت.
احتمالا همین باشه.

pro_mvb
پنج شنبه 28 دی 1391, 10:35 صبح
نه آخه اجرا میشه چون متد Do داره اجرا میشه بعدشم متد print صدا زده شده اینم کلاس ها:
کلاس ListenerHandler


package jspy;

import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ClientListener implements Runnable{


@Override
public void run() {
try{
ServerSocket listener= new ServerSocket(1367);

while(true){
Socket server_socket= listener.accept();
ClientInput Do=new ClientInput();
Do.ClientInput(server_socket);
Do.Do();
Do.print();

}
}catch(Exception e){ }

}
}




که توسط ایشون صدا زده میشه:


package jspy;
import com.sun.xml.internal.bind.v2.runtime.reflect.Liste r;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Jclient {

public void mains() {

System.out.println("hello");
ClientListener handler=new ClientListener();
Thread t1=new Thread(handler);

t1.start();
}

public void writer(String a){

while(true){
if(a!=""){
try{
Socket socket=new Socket("127.0.0.1",1368);
System.out.println("scoket ok");
OutputStream os= socket.getOutputStream();
System.out.println("os az tarighe socket anjam shod");

PrintStream printstream= new PrintStream(os);
printstream.print(a);
os.close();
socket.close();
printstream.flush();

}catch(Exception e){
e.printStackTrace();
}
a="";
writer(a);
}else{return;}


}
}
}



کلاس ClientInput رو هم که بالا قرار دادم دیگه اینجا دوباره نذاشتم.

spiderman200700
پنج شنبه 28 دی 1391, 14:05 عصر
در اینجا:

Jclient client=new Jclient();
client.mains();
client.writer(t1.getText());
ClientInput inclient=new ClientInput();
arr=inclient.print();


شما اول متد writer رو صدا زدی ، بعد inclient رو ایجاد کردی.
شاید از همینجا باشه.جای خطوط 3 و 4 رو عوض کن شاید درست بشه.

pro_mvb
پنج شنبه 28 دی 1391, 15:29 عصر
بازم نشد مثل همیشه اررور داد اررورش اینه:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at jspy.Client.b1ActionPerformed(Client.java:98)
at jspy.Client.access$000(Client.java:11)
at jspy.Client$1.actionPerformed(Client.java:34)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.jav a:6505)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3321)
at java.awt.Component.processEvent(Component.java:627 0)
at java.awt.Container.processEvent(Container.java:222 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:4861)
at java.awt.Container.dispatchEventImpl(Container.jav a:2287)
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4422)
at java.awt.Container.dispatchEventImpl(Container.jav a:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713 )
at java.awt.Component.dispatchEvent(Component.java:46 87)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:707)
at java.awt.EventQueue.access$000(EventQueue.java:101 )
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPri vilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 677)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:90)

spiderman200700
پنج شنبه 28 دی 1391, 16:15 عصر
راستش دیگه نمیدونم چی بگم.
باید پروژه رو دید و بررسی کرد.
اینجوری نمیشه جواب درستی داد

pro_mvb
پنج شنبه 28 دی 1391, 16:27 عصر
واسط پی ام خصوصی کردم