1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.net.*;
public class NameListListenerTest extends JFrame implements ActionListener{

    static ArrayList<String> nameList_2;
    static JFrame bframe;
    static JPanel p;
    //JButton userB;



    public NameListListenerTest() {
        try {
            JButton userB;
            //ArrayList<String> ls = new ArrayList<String>();

            String str = "hiwhatsupmate#!#jake sally joe#!#asdfasdf#!#kurt#!#";

            int start = str.indexOf("#!#");
            System.out.printf("%d\n", start);
            int end = str.indexOf("#!#", start+1);
            System.out.printf("%d\n",end);
            String userNames = str.substring(start+3, end-3);
            System.out.printf("%d\n",userNames);

            int x = userNames.length();
            while(true) {
                if(x > 1) {
                    if(userNames.indexOf(" ") == 0)
                        nameList_2.add(userNames.substring(1,userNames.indexOf(" ",1)));
                    else
                        nameList_2.add(userNames.substring(0,userNames.indexOf(" ")));
                }
                else
                    break;
            }   
                p = new JPanel(new GridLayout(nameList_2.size(),1));
                for(int i=0; i<nameList_2.size(); i++){
                    userB = new JButton(nameList_2.get(i));
                    userB.addActionListener(this);
                    p.add(userB);
                }
            }  catch (Exception e) {
                        e.printStackTrace();
                }
        }
    public static void main(String args[]) {
        //nameList_2.add("kurt");       
        bframe=new NameListListenerTest();  
        bframe.add(p);      

        bframe.setLocation(32,32);          
                bframe.setSize(50,500);
        bframe.setVisible(true);                
        bframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

    }

    public void actionPerformed(ActionEvent e) {
        JButton jb = (JButton) e.getSource();
        System.out.printf("Connectin to user\n");

    }
}

我的输出是

13
30 
java.util.IllegalFormatConversionException: d != java.lang.String
    at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
    at java.util.Formatter$FormatSpecifier.printInteger(Unknown Source)
    at java.util.Formatter$FormatSpecifier.print(Unknown Source)
    at java.util.Formatter.format(Unknown Source)
    at java.io.PrintStream.format(Unknown Source)
    at java.io.PrintStream.printf(Unknown Source)
    at NameListListenerTest.<init>(NameListListenerTest.java:28)
    at NameListListenerTest.main(NameListListenerTest.java:53)
Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at NameListListenerTest.main(NameListListenerTest.java:54)
Process java exited with code 1

所以我的第一个打印语句有效,但我尝试注释掉一些东西,它似乎完全一样。我之前在没有整个子字符串和while循环部分的情况下让这个程序工作,但是我手动放入了一个ArrayList,然后在构造函数中添加了四个名称

编辑:

现在我得到

java.lang.NullPointerException
    at NameListListenerTest.<init>(NameListListenerTest.java:36)
    at NameListListenerTest.main(NameListListenerTest.java:53)
Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at NameListListenerTest.main(NameListListenerTest.java:54)

固定后%s

4

3 回答 3

3

格式说明符不正确。代替

System.out.printf("%d\n",userNames);

System.out.printf("%s\n",userNames);

此外,ArrayList nameList_2从未初始化导致NPE如编辑所示。

ArrayList<String> nameList_2 = new ArrayList<>()
于 2013-04-19T12:52:00.927 回答
1

由于 p,你得到空指针异常。我认为 nameList_2.add(userNames.substring(0,userNames.indexOf(" ")));有问题因此nameList_2.size()返回 null

于 2013-04-19T13:05:45.430 回答
1

问题来自:

System.out.printf("%d\n",userNames);

System.out.printf 遵循C printf语法。在这种语法中,%d 代替了一个整数,但你给它的是一个字符串。

于 2013-04-19T12:52:56.523 回答