Java ArrayList在第一个元素上打印空字符

Java ArrayList在第一个元素上打印空字符,java,arraylist,null,char,Java,Arraylist,Null,Char,该程序的主要思想是随机生成一条包含特定字符的tweet(140个字符)“+”、“+”、“+”;“+”:”除其他外 问题是,当我生成每个字符并将其添加到列表中时,一切看起来都很好(我添加了一行以检查添加了哪个字符)。但是,每当我打印结果时,大部分时间都会得到null+140个其他字符。代码如下: import java.util.Scanner; import java.util.List; import java.util.Arrays; import java.util.ArrayList;

该程序的主要思想是随机生成一条包含特定字符的tweet(140个字符)“+”、“+”、“+”;“+”:”除其他外

问题是,当我生成每个字符并将其添加到列表中时,一切看起来都很好(我添加了一行以检查添加了哪个字符)。但是,每当我打印结果时,大部分时间都会得到null+140个其他字符。代码如下:

import java.util.Scanner;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Random;

public class P1{

String tweet;
List<Character> caracteres;
Random rand;
char nextChar;
int number;

public P1(){
    caracteres = new ArrayList<Character>();
    rand= new Random();

    for(int i=97; i<=122; i++){
        nextChar = new Character((char)i);
        caracteres.add(nextChar);
    }
    caracteres.add(new Character((char)58));
    //System.out.println("Added" + new Character((char)58));
    caracteres.add(new Character((char)59));
    //System.out.println("Added" + new Character((char)59));
    caracteres.add(new Character((char)32));
    //System.out.println("Added" + new Character((char)32));
    caracteres.add(new Character((char)13));
    //System.out.println("Added" + new Character((char)13));
    caracteres.add(new Character((char)63));
    //System.out.println("Added" + new Character((char)63));
    caracteres.add(new Character((char)33));
    //System.out.println("Added" + new Character((char)33));
    caracteres.add(new Character((char)46));
    //System.out.println("Added" + new Character((char)46));
    caracteres.add(new Character((char)44));
    //System.out.println("Added" + new Character((char)44));
}

public String generaTweet(){
    for(int i=0; i<140; i++){
        number = Math.abs((rand.nextInt())%34);
        if(number == 13){
            tweet+= '\n';
        }
        else{
            tweet+= caracteres.get(number);
        }
        System.out.println(i + ". " + caracteres.get(number)); //added char
    }
    return tweet;
}


public static void main(String [] args){
    P1 ejer = new P1();
    System.out.println(ejer.generaTweet());
}

}
import java.util.Scanner;
导入java.util.List;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.Random;
公开课P1{
字符串tweet;
列出字符;
随机兰德;
char nextChar;
整数;
公共P1(){
caracteres=新的ArrayList();
rand=新随机数();

对于(int i=97;i这是因为您从未初始化字段
tweet
。您的构造函数应该如下所示:

public P1(){
    tweet = "";
    //....
}
线路

String tweet;
应该是

String tweet = "";

tweet
null
开头,因此第一次添加字符时,串联运算符
+
使用
字符串
对于
tweet

String tweet;
是一个字段,由于未显式初始化,它将保留默认值,对于字符串等对象,默认值为
null

tweet += someString
你最终得到的是

tweet = tweet + someString;
因为在开始时,tweet
null
,所以

null + someString
要解决此问题,可以使用空白字符串初始化
tweet

String tweet  = "";
其他改进: 您应该避免在循环中连接字符串。更好的解决方案是使用
StringBuilder
,并向其添加新的文本块

也要避免。不要含糊不清

for(int i=97; i<=122; i++){
    nextChar = new Character((char)i);
    caracteres.add(nextChar);
}

用于(int i=97;i@TAsk他在他的问题中写道——他正在生成一条随机的推文。因为这是主要的想法,数组列表只有完整的有效字符列表。所以当我使用随机数访问时,我正在做的是向字符串推文中添加一个随机字符。这就成功了,我没有意识到,谢谢。我会尽快将它标记为正确的你也是第一个。@艾伦-虽然你的问题已经解决,但是考虑使用StrugBuudio.Apple()要继续在字符串中添加内容而不是
+
,字符串上的连接运算符必须询问仅连接有什么问题?提前谢谢。@Alan每次在循环中调用类似
result=result+otherString的代码时(假设
result
是字符串)您正在创建临时StringBuilder,它需要首先从
结果中复制字符,然后从
其他字符串中复制字符,然后创建新的字符串对象(这将是复制字符的总和)。因此,在每次迭代中,您需要花费更多的时间复制以前的
结果
,因为它会变得更大。相反,最好显式创建自己的
StringBuilder
,并将所有部分附加到它,然后将其转换为字符串()
@Alan查看此链接:@Alan没问题,接受答案是个人选择,只要你接受的答案正确,我不介意你选择其他答案:)我很高兴你也从这个答案中学到了一些东西。
for (char ch = 'a'; ch<='z'; ch++) {
    caracteres.add(ch);
}