public class StrTokDemo {
    public final static int MAXFIELDS=5;
    public final static String DELIM="|";
    
    public static String[] process(String line){
        String[] results=new String[MAXFIELDS];
        
        StringTokenizer st=new StringTokenizer(line,DELIM,true);
        int i=0;
        
        while(st.hasMoreTokens()){
            String s=st.nextToken();
            if(s.equals(DELIM)){
                if(i++>=MAXFIELDS)
                    throw new IllegalArgumentException("Input line"+line+"has too many fields");
                continue;
            }
            results[i]=s;
           
        }
        return results;
    }
    
    public static void printResults(String input,String[] outputs){
        System.out.println("Input:"+input);
        for(int i=0;i<outputs.length;i++)
            System.out.println("Output"+i+"was:"+outputs[i]);
    }
    
    public static void main(String[] a){
        printResults("A|B|C|D",process("A|B|C|D"));
        printResults("A||C|D",process("A||C|D"));
        printResults("A|||D|E",process("A|||D|E"));
    }
}

解决方案 »

  1.   

      printResults("A||C|D",process("A||C|D"));
     printResults("A|||D|E",process("A|||D|E"));这里的a 到c d中间少个b 用null代替
    ade中间少2个 用null代替
      

  2.   

    问题在这里
    if(i++>=MAXFIELDS)
      throw new IllegalArgumentException("Input line"+line+"has too many fields");
    continue;它动到了i,当s==DELIM时,i照常+1,之后不往result中写入任何String对象就continue
    如果没有连续的|出现,程序正常
    如果连续的|出现,就会造成result[i]被跳过,保持了初始化时的值null(其实不用这么麻烦,StringTokenizer st=new StringTokenizer(line,DELIM,true);的第3个参数去掉或改为false就可以了)
      

  3.   

    但是StringTokenizer对象不是会放弃相邻连续的分隔符么
    public class StringTokenizerTest {
        public static void main(String[] args){
            StringTokenizer st=new StringTokenizer("Hello, ,,World||of|java",",|");
            while(st.hasMoreElements())
                System.out.println("Token:"+st.nextElement());
        }
    }
    这个中间就不会输出null
      

  4.   

    但是StringTokenizer对象不是会放弃相邻连续的分隔符么
    public class StringTokenizerTest {
      public static void main(String[] args){
      StringTokenizer st=new StringTokenizer("Hello, ,,World||of|java",",|");
      while(st.hasMoreElements())
      System.out.println("Token:"+st.nextElement());
      }
    }
    这个中间就不会输出null
      

  5.   

    也不能说StringTokenizer放弃相邻的分隔符
    返回还是不返回分割符,由创建StringTokenizer时的参数决定。
    但不管怎样,StringTokenizer返回的token序列中并不包括null
    你的代码之所以有null,是你的代码逻辑缺陷造成的,不是StringTokenizer返回的