2015-03-31 57 views
2

我想做一个广播命令。当/broadcast This is a test运行时,它会广播这是一个测试(带空格)在游戏中。我试过使用:从参数广播文本

Bukkit.getServer().broadcastMessage(ChatColor.RED + args[0] + " " + args[1] + " " + args[2] + " " + args[3] + " " + args[4] + " " + args[5] + " " + args[6] + " " + args[7] + " " + args[8] + " " + args[9] + " " + args[10] + " " + args[11] + " " + args[12] + " " + args[13] + " " + args[14]); 

但我知道这是错误的。我怎样才能解决这个问题?

回答

1

这里是结束了工作代码:

if (args.length > 0) { 
    String broadcast = ""; 
    for (String message : args) { 
     broadcast = (broadcast + message + " "); 
    } 
    Bukkit.getServer().broadcastMessage(ChatColor.WHITE + "[" + ChatColor.GOLD + "BROADCAST" + ChatColor.WHITE + "]" + ChatColor.RED + broadcast); 
} 
2

使用

Bukkit.getServer().broadcastMessage(ChatColor.RED + args[0] + " " + args[1] + " " + args[2] + " " + args[3] + " " + args[4] + " " + args[5] + " " + args[6] + " " + args[7] + " " + args[8] + " " + args[9] + " " + args[10] + " " + args[11] + " " + args[12] + " " + args[13] + " " + args[14]); 

如果恰好有15参数才有效。如果参数较少,则会抛出一个ArrayIndexOutOfBoundsException,因为您试图访问不存在的数组的一部分。如果有更多的参数,代码将只打印前15个参数,其余的将被忽略。

要解决这个问题,就需要通过所有的参数循环:

for(String argument : args) 

然后,你需要将参数添加到广播消息,与空间一起:

message+=argument; 
message+=" "; 

为避免ArrayIndexOutOfBoundsException,您还应该检查是否至少有一个参数:

if(args.length >= 1) 

所以,这里是你的代码可能是什么样子:

if (args.length >= 1) { // make sure there is at least 1 argument to avoid an ArrayOutOfBoundsException 
    String message = ""; // initialize the "message" variable 
    for (String argument : args) { // loop through all of the arguments 
     message += argument; // add the argument to the message 
     message += " "; // add a space to the message 
    } 

    Bukkit.getServer().broadcastMessage(ChatColor.RED + message); // broadcast the message 
} 
3

如果您使用的是Java 8中,您可以使用一个方便的方法与Collectors

Bukkit.getServer().broadcastMessage(
    ChatColor.RED + Arrays.stream(args) 
         .collect(Collectors.joining(" ")) 
); 

否则,通过阵列和使用迭代一个StringBuilder连接元素:

if (args.length == 0) 
    // Premature return instead of using if-else 
    // to reduce cyclomatic complexity. 
    return false; 
if (args.length == 1) { 
    // fast path 
    Bukkit.getServer().broadcastMessage(ChatColor.RED + args[0]); 
    return false; 
} 

StringBuilder message = new StringBuilder(args[0]); 
for (String each : args) 
    message.append(" ").append(each); 
String broadcast = message.deleteCharAt(0).toString(); 
Bukkit.getServer().broadcastMessage(ChatColor.RED + broadcast);