2013-08-14 1 views
0

다음 파일에 기록하지 않는 것은 내 출력 : (모든 코드가 올 것으로 보인다와 파일이 있기 때문에,이 예외를 던지고 왜 이해가 안자바가 제대로

/channel #blarg123 
chanswitch: #blarg123 
hello 
----->PRIVMSG #blarg123 :hello 
----->Logging: -->:phyrrus92 :hai ] 
Error open 
Exception in thread "main" java.lang.NullPointerException 
    at irc_channel_obj.writemsg(irc_channel.java:66) 
    at irc_channel.sendmsg(irc_channel.java:24) 
    at irc.irc_log(irc.java:28) 
    at irc.main(irc.java:91) 

./# blarg123) 여기

코드입니다 :

File: irc.java 

import java.net.*; 
import java.io.*; 

class irc 
{ 
    static Socket server; 
    static BufferedReader in; 
    static BufferedReader stdin; 
    static PrintWriter out; 
    static String channel; 
    static irc_channel chanlist; 

    public static void irc_log(String line) 
    { 
      System.out.println("----->Logging: " + line); 
      String[] splitted = line.split(" "); 
      String channel = "", sendline = ""; 
      if (splitted[0].indexOf("!") != -1) 
        splitted[0] = splitted[0].substring(0, splitted[0].indexOf("!")); 
      for (int i = 0; i < splitted.length; i++) 
      { 
        sendline += splitted[i]; 
        if (splitted[i].indexOf("#") != -1) 
        { 
          channel = splitted[i]; 
        } 
      } 
      chanlist.sendmsg(channel, sendline); 
    } 

    public static void main(String args[]) 
    { 
      String user_line; 
      channel = "none"; 
      chanlist = new irc_channel(); 
      try 
      { 
        server = new Socket(args[0], 6667); 
        in = new BufferedReader(new InputStreamReader(server.getInputStream())); 
        stdin = new BufferedReader(new InputStreamReader(System.in)); 
        out = new PrintWriter(server.getOutputStream()); 
      } 
      catch (UnknownHostException e) {} 
      catch (IOException e) {} 
      irc_in input = new irc_in(server, out, stdin); 
      Thread t = new Thread(input); 
      t.start(); 
      while (true) 
      { 
        try { 
          user_line = in.readLine(); 
          String[] splitted = user_line.split(" "); 
          if (splitted[0].equals("PING")) 
          { 
            out.print("PONG " + splitted[1] + "\r\n"); 
            out.flush(); 
            continue; 
          } 
          boolean chan_filtered = false; 
          if (splitted[0].indexOf("!") != -1) 
          { 
            splitted[0] = "" + splitted[0].substring(0, splitted[0].indexOf("!")); 
          } 
          for (int i = 1; i < splitted.length && !chan_filtered; i++) 
          { 
            if (splitted[i].equals(channel)) 
            { 
              chan_filtered = true; 
              user_line = "\u001B[0;32m-->" + splitted[0] + " "; 
              for (int x = 3; x < splitted.length; x++) //x=i 
              { 
                user_line += splitted[x] + " "; 
              } 
              user_line += "\u001B[0m]"; 
            } 
            else if (splitted[i].indexOf("#") != -1) 
            { 
              chan_filtered = true; 
              user_line = "\u001B[0;31m-->" + splitted[0] + " "; 
              for (int x = 2; x < splitted.length; x++) //x=i 
              { 
                user_line += splitted[x] + " "; 
              } 
              user_line += "\u001B[0m]"; 
            } 
          } 
          if (!channel.equals("none")) 
          { 
            irc_log(user_line); 
            //chanlist.displayall(channel); 
          } 
          //else 
          { 
            System.out.println(user_line); 
            System.out.flush(); 
          } 
          //Thread.sleep(2000); 
        } catch (IOException e) {} 
      } 
    } 
} 

class irc_in implements Runnable 
{ 
    static Socket server; 
    static PrintWriter out; 
    static BufferedReader stdin; 

    irc_in(Socket a, PrintWriter b, BufferedReader c) 
    { 
      server = a; 
      out = b; 
      stdin = c; 
    } 

    public void run() 
    { 
      String user_line; 
      while (true) 
      { 
        try 
        { 
          //Thread.sleep(1000); 
          user_line = stdin.readLine(); 
          String[] splitted=user_line.split(" "); 
          if (splitted[0].equals("/channel") || splitted[0].equals("/JOIN")) 
          { 
            user_line = ""; 
            splitted[0] = splitted[0].substring(1, splitted[0].length()); 
            for (int i = 0; i < splitted.length; i++) 
              user_line += splitted[i] + " "; 
            irc.channel = splitted[1]; 
            System.out.println("chanswitch: " + irc.channel); 
            if (splitted[0].equals("channel")) 
              continue; 
          } 

          else if (splitted[0].equals("/setname") && splitted.length >= 2) 
          { 
            String user_name = ""; 
            for (int i = 0; i < splitted.length; i++) 
              user_name += splitted[i]; 
            out.print("NICK " + splitted[1] + "\r\n"); 
            out.print("USER " + splitted[1] + " * 8 : " + user_name + "\r\n"); 
            out.flush(); 
          } 

          else if (!splitted[0].startsWith("/")) 
          { 
            int startpos = 0; 
            String send_channel = irc.channel; 
            if (splitted[0].startsWith("#")) 
            { 
              send_channel = splitted[0]; 
              startpos = 1; 
            } 
            user_line = "PRIVMSG " + send_channel + " :"; 
            for (int i = startpos; i < splitted.length; i++) 
              user_line += splitted[i] + " "; 
            System.out.println("----->" + user_line); 
          } 

          else 
            user_line = user_line.substring(1, user_line.length()); 

          out.print(user_line + "\r\n"); 
          out.flush(); 
        } 
        catch (IOException e) {} 
      } 
    } 
} 

그리고 다른 파일

File: irc_channel.java 
import java.io.*; 
import java.util.*; 

public class irc_channel 
{ 
    public static ArrayList<irc_channel_obj> list; 

    irc_channel() 
    { 
      list = new ArrayList<irc_channel_obj>(); 
    } 

    public void sendmsg(String channel, String line) 
    { 
      for (int i = 0; i < list.size(); i++) 
      { 
        if (list.get(i).name.equals(channel)) 
        { 
          list.get(i).writemsg(line); 
          return; 
        } 
      } 
      irc_channel_obj newchan = new irc_channel_obj(channel); 
      newchan.writemsg(line); 
      list.add(newchan); 
    } 

    public void displayall(String channel) 
    { 
      for (int i = 0; i < list.size(); i++) 
      { 
        if (list.get(i).name.equals(channel)) 
        { 
          list.get(i).displayall(); 
          return; 
        } 
      } 
      System.out.println("No messages for channel " + channel); 
    } 
} 

class irc_channel_obj 
{ 
    public static String name; 
    static PrintWriter out; 
    static BufferedReader in; 

    irc_channel_obj(String chan) 
    { 
      name = chan; 
      try 
      { 
        out = new PrintWriter(name); 
        out.println("Channel: " + name); 
        out.flush(); 
      } 
      catch (FileNotFoundException e) 
      { 
        System.out.println("Error open"); 
        return; 
      } 
    } 

    public void writemsg(String line) 
    { 
      out.println(line); 
      out.flush(); 
    } 

    public void displayall() 
    { 
      String line = ""; 
      try 
      { 
        in = new BufferedReader(new FileReader(name)); 
        while ((line = in.readLine()) != null) 
        { 
          System.out.println(line); 
        } 
      } 
      catch (FileNotFoundException e) { return; } 
      catch (IOException e) { return; } 
    } 
} 
,

도움이 될 것입니다.

+0

이는'irc_channel.java'에서 66 행입니까? – jlordo

+0

@jlordo 함수 이름 앞에 빈 줄이 있습니다 – phyrrus9

+0

out이 null 포인터를 던지고 있습니다 – orangegoat

답변

1

하여 출력의 관련 부분은 :

Error open 
Exception in thread "main" java.lang.NullPointerException 
    at irc_channel_obj.writemsg(irc_channel.java:66) 

Error open 당신의 irc_channel_obj 생성자가 FileNotFoundException을 던졌다 것을 의미한다. 그래서 outnull으로 남습니다. >NullPointerException-out 여전히 null입니다

나중에 writemsg(String line) 당신은

out.println(line); 

를 호출합니다.

+0

나는 그만큼 알았다. 문제는 그 예외가 throw 된 이유입니다. – phyrrus9

+0

['new PrintWriter (String filename)'] (http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter java.lang.String))는 지정된 문자열이 기존의 쓰기 가능한 일반 파일을 나타내지 않고 해당 이름의 새 일반 파일을 만들 수 없거나 파일을 열거 나 만들 때 다른 오류가 발생하는 경우 'FileNotFoundException'을 발생시킵니다. – jlordo

+0

@ phyrrus9 : 무슨 일이 일어나고 있는지 알아 보려면'System.out.println ("Error open");을'e.printStackTrace();'로 대체하십시오. – jlordo

0

내가 찾은 해결책은 실제로 로그의 배치 였고, 로그에서 이미 목록에서 제거 된 채널을 찾고 있었기 때문에 서버의 readline 바로 아래로 이동해야했습니다.