高手,您好:
    我是一名学习软件工程的学生,现在,我在做我的第一个作品:
    “一个自己设计的CS结构聊天系统”:
    已经写了近3W行代码了...
    我是自己设计的这个作品:
    C端0:优秀教师客户端.
    C端0:学生客户端.
    S端:学校运营商服务端.
    D端:开发者运营商服务器.
    首先D端运行,S端运行,连接D端.
    然后C端运行,连接S端,进行账户验证,再连接D端,进行“授权期限”的检查....
    如果C端通过了S端的“有这个人”的验证后,再通过D端的“授权期内”的验证后,就可以得到“整个系统功能的使用”了.....
    现在,我运行了D端,S端后,点击了这个按钮:
    
    出现了弟我的MyEclipse中出现的界面...:
    
    因为是“第一个完整的Java作品”,弟我在调试运行时错误的技术上,还不是很有经验...
    求高手指导:
    这个错误页面,应该以什么思路,什么修改流程,什么修改步骤,来进行上面的错误的排查...
    并且,如果弟我希望能够在CS结构聊天系统的运行时错误的排查能力之上,快速拥有调试的熟练能力的话...
    弟我应该看什么资料,学习什么资源,什么教材,能够“快速拥有这个能力”...
    希望高手能够解决弟我的(图二)中的问题....
    谢谢高手的过目!!
    一百分奉上!!
                                                              一位日日夜夜向着理想奔跑的筑梦者
                                                              2013年9月12日星期四下午18点55分调试javamyeclipse聊天学习经验

解决方案 »

  1.   

    这个很明显嘛,空指针异常。Recv.java 33行。楼主可以在这行抓个断点
      

  2.   

    ExceptionInInitializerError MyJButton2 59行 
    估计是静态变量初始化顺序错误,代码贴出来看看
      

  3.   

    运行程序的时候不要点 run , 点 debug, 然后单步跟踪。
      

  4.   

    顺溜哥,弟我现在初步的想法是:
        现在的“CS系统的好友列表”这个UI,是:
        能够让用户点击之后,与远程的服务器进行相关数据交互的“动态的”Java程序...
        这里,弟我再进行相关功能的开发时,采用了“前台用一个线程展示自己的用户UI”“后台用一个类文件进行S端的用户在线数据的接收”,但是,得到了上面的“空指针异常”的错误结果:
        
        (由于弟我想采用“前台创建出用户UI进行好友列表的展示”,在“后台进行对应S端数据的接收”,让S端的数据,"能够交给一个已经创建好的对象",从而,弟我将创建前台与后台接收数据的类,"并发运行的"类文件"MathTeacher类"进行了在"接收数据之前"的书写...
        于是...
        由于“所创建的MathTeacher类文件没有得到自己的展位上的数据”“出现了空指针异常”的错误...
        希望高手能够点拨:
        腾讯的工程师,是怎样让自己的好友列表UI,“既能够与主线程的程序相互并发”“又能够让自己的UI,"即时更新自己的用户在线数据"”?
        采用Java语言,怎样才能够将这里的问题.解决...?
        
        顺溜哥,弟我的MyJButton2的代码如下:
        package c_port_packageDoctor;import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;import javax.swing.JButton;public class MyJButton2 extends JButton {
    boolean isMyUser = false;
    DataOutputStream dops0 = null;
    DataOutputStream dops1 = null;
    DataInputStream dips0 = null;
    DataInputStream dips1 = null;
    String MySysNum = null;
    public static String MyUID = null;
    public static String MyPWD = null;
    String str2 = null;
    public static String str3 = null;
    String str4 = null;
    Login log = null;
    public static Socket so3 = null;
    public static Socket so2 = null;
    /**
     * 
     */
    private static final long serialVersionUID = 1L; /**
     * @param args
     */
    public MyJButton2(String button, String UID, String pwd, Login log_in) {
    super(button);
    MyUID = UID;
    MyPWD = pwd;
    InetAddress addr = null;
    try {
    addr = InetAddress.getLocalHost();
    } catch (UnknownHostException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    str3=addr.getHostAddress().toString();//获得本机IP
    log = log_in;
    System.out.println("" + log.toString());
    this.addActionListener(new ActionListener() { @Override
    public void actionPerformed(ActionEvent et) { boolean isOurMember = false;
    try {
    so2 = new Socket(Recv.D_PORT_SERVER, 8888);
    so3 = new Socket(Recv.S_PORT_SERVER,9999);
    dops0 = new DataOutputStream(so3.getOutputStream());
    dips0 = new DataInputStream(so3.getInputStream());
    dops1 = new DataOutputStream(so2.getOutputStream());
    dips1 = new DataInputStream(so2.getInputStream());
    System.out.println("so3++++++++"+so3);
    dops0.writeUTF("0##"+MyUID + "%%" + MyPWD+"%%"+str3);
    dops0.flush();
    dops0.close(); 
    isOurMember = dips0.readBoolean();
    if(isOurMember){
    dops1.writeUTF("9##"+String.valueOf(Recv.MySystemserialnum));
    boolean islegality = dips1.readBoolean();
    if(islegality){
    new Recv(so3);
    JProgressBar1 obj = new JProgressBar1();                                                                                                                                                                                                    
    Thread thread1 = new Thread(obj,"MyThread1");
    thread1.start();
    }
    else{
    new PayForMyCopyRigth(so2);
    System.exit(0);
    }
    }else{
    new C_port_registerfuct(so2);
    System.exit(0);
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    });
    }
    }
        顺溜哥,上面的类文件,所担负的职责是:
        “进行第一幅图片中的"登录按钮"点击后”的逻辑...
        希望顺溜哥,随时吩咐弟我贴图...
        今天晚上,弟我能够“干到明天早晨”!!
      

  5.   

    上面疯狂熊猫人哥给予弟我的提示“第33行的空指针异常”的所在类...
        后台的“接收数据的Recv类”如下文:
        package c_port_packageDoctor; import java.io.DataInputStream;
    import java.io.IOException;
    import java.net.Socket;public class Recv {
    int para = -1; 
    int sign = 0;
    static Socket so3 = null;
    String str =null;
    String signal = null;
    static int nowStringnum = 0;
    static int allStringnum = 20494;
    static int progressvalue = 0;
    static Integer MySystemserialnum = -1;
    static String MyOrderNum = null;
    static String[] MyJButton0content = new String[200];
    static String[] MyJButton0URL = new String[200];
    static String[] MyJButton0doctor_ficia = new String[200];
    static String buffer = null;
    static int[] MyJButton0SystempriKey = new int[200];
    static int[] MyJButton0doctoronline = new int[200];
    static int[] MyJButton0complicatingnum = new int[200];
    static int[] doctoronline = new int[200];
    static String myCustomercaseHistoryPath = "D:\\MyDoc\\Mywork\\MyCustomerData.txt";
    static String MyFriendIP = null;
    static String D_PORT_SERVER = "127.0.0.1";
    static String S_PORT_SERVER = "127.0.0.1";
    static String C_PORT_CLIENT = "127.0.0.1";
    static String PayAuthorizeUrl = "";
    static ChatClientFriendlist obj0 = new ChatClientFriendlist();
    static MathTeacher obj1 = new MathTeacher();
    static SQA_enterprise obj2 = new SQA_enterprise();
    static Psychological_gas_station obj3 = new Psychological_gas_station();
    static EnglishTeacher obj4 = new EnglishTeacher();
    static ChineseTeacher obj5 = new ChineseTeacher();
    static Advertisement obj6 = new Advertisement();
    static final Thread thread0 = new Thread(obj0,"MyThread0");
    static final Thread thread1 = new Thread(obj1,"MyThread1");
    static final Thread thread2 = new Thread(obj2,"MyThread2");
    static final Thread thread3 = new Thread(obj3,"MyThread3");
    static final Thread thread4 = new Thread(obj4,"MyThread4");
    static final Thread thread5 = new Thread(obj5,"MyThread5");
    static final Thread thread6 = new Thread(obj6,"MyThread6");
    static String caseHistoryPath = "E:\\Audio\\44100CustomercaseHistoryAccessdoctor\\2.wav";
    static String ComplainAccessPath = "E:\\Audio\\44100CustomerComplainAccessdoctor\\2.wav";
    static String FileAccessPath = "E:\\Audio\\44100FileAccessdoctor\\2.wav";
    static String InfoAccessPath = "E:\\Audio\\44100InfoAccessdoctor\\2.wav";
    static String IPAccessPath = "E:\\Audio\\44100IPAccessdoctor\\2.wav";
    static String doctorExit = "E:\\Audio\\44100doctorExit\\2.wav"; 
    static String doctorFileRecvOver = "E:\\Audio\\44100doctorFileRecvOver\\2.wav"; 
    static String doctorLogin = "E:\\Audio\\44100doctorLogin\\2.wav";
    static String OrderNumAccessdoctor = "E:\\Audio\\44100OrderNumAccessdoctor";

    public Recv(Socket s3){
    so3 = s3;
    }
    public void receiveTheData(){
    try {
    DataInputStream dips1 = new DataInputStream(so3.getInputStream());
    while(true){
    String buffertemp = dips1.readUTF();
    String[] bufferData = buffertemp.split("[##]");
    sign = Integer.parseInt(bufferData[0]);
    para = Integer.parseInt(bufferData[1]);
    buffer = bufferData[2];
    switch(sign){
    case 1://接收D端的数据,让C端的客户端刷新自己的广告展板。
    {
    ManageC_port_MDSpara0Channel_Thread m0 = new ManageC_port_MDSpara0Channel_Thread(buffer,para);
     str = str + buffer;
     nowStringnum = nowStringnum + str.length();
     progressvalue = nowStringnum/allStringnum*100;
    m0.start();
    }
    case 2://接收S端的数据,让C端的客户端将好友的消息进行接收.
    {
    ManageC_portRecv_chatwordChannel1 m1 = new ManageC_portRecv_chatwordChannel1(buffer,so3);
    m1.start();
    PlaySysAudio.Play(InfoAccessPath);
    }
    case 3://
    {
    MySystemserialnum = para;

    }
    case 4://接收S端传至C端的好友IP地址。
    {
    MyFriendIP = buffer;
    PlaySysAudio.Play(IPAccessPath);
    }
    case 5://接收D端传至C端的“是否库中有本用户名”并且“提交注册账户合法”“需要等待系统认证时间”的提示。
    {
    if(buffer.equals("true")){
    C_port_registerfuct.jL8.setText("恭喜!!该用户名可以注册!!请您将余下的数据填写完整,点击\"提交\"按钮");
    }
    if(buffer.equals("false")){
    C_port_registerfuct.jL8.setText("对不起!!您填写的用户名在本服务器中已经存在同名账户,请您更换一个用户名,重新提交...");
    }
    }
    case 6://接收S端传至C端的单号。
    {
    MyOrderNum = buffer;
    PlaySysAudio.Play(OrderNumAccessdoctor);
    }
    case 7:
    {
    new NoteUserTheChargeOfAuthorize(so3);
    }
    case 8:
    {
    signal = buffer;
    if(signal.equals("invalid")){
    PayForMyCopyRigth.jL.setText("对不起!!本授权码已经失效!!请您到宏福校区后勤集团杨老师处购买3毛钱一天的产品授权,30天起!!");
    }else if(signal.equals("OKay!!OurCustomer!!")){
    PayForMyCopyRigth.jL.setText("谢谢您的惠顾!!本系统的员工,将竭诚为我们的客户,送上最满意的服务!!请您重新启动本产品!!");
    }else{
    PayForMyCopyRigth.jL.setText("对不起!!本授权码非法!!请重新检查您的输入!!或者请您到宏福校区后勤集团杨楠老师处购买3毛钱一天的产品授权,30天起!!");
    }
    }
    case 9:
    {
    ManageTheCustomercaseHistoryRecv m9 = new ManageTheCustomercaseHistoryRecv(buffer,para,so3);
    m9.start();
    }
    case 10:
    ManageGetTheS_port_PayForTheSysFuctionSignal m10 = new ManageGetTheS_port_PayForTheSysFuctionSignal(para,buffer);
    m10.start();
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
      

  6.   

    没遇到过,猜不出来还是你自己用debug跟下看看原因吧
      

  7.   

    OKay!!
        顺溜哥!!
        谢谢您的相助!!
        希望您能够告诉弟我:
        您的信箱...
        弟我希望能够在今后,经常得到顺溜哥的提点.
        我也能够在“顺溜哥需要的时候”,贡献自己的力量..
      

  8.   

    会不会跟so2,so3初始化顺序和赋值顺序不一致有关系?
      

  9.   

    在你调用so2 = new Socket(Recv.D_PORT_SERVER, 8888);时
    D_PORT_SERVER还没完成初始化
      

  10.   

    真够乱的,new int(100) 都有