ChatColor.translateAlternateColorCodes出错

时间:2014-09-15 19:03:11

标签: java nullpointerexception bukkit

我在ChatColor.translateAlternateColorCodes收到错误,因为我在插件中添加了自定义配置。

这是错误:

Caused by: java.lang.NullPointerException
        at org.bukkit.ChatColor.translateAlternateColorCodes(ChatColor.java:206)
 ~[spigot.jar:git-Spigot-1473]
        at com.gmail.santiagoelheroe.LoginVip.<init>(LoginVip.java:44) ~[?:?]

错误说问题出现在LoginVip类内的第44行。

YamlConfiguration configuracion = YamlConfiguration.loadConfiguration(configFile);
String textpermisos = configuracion.getString("Configuration.NoPermissionsMessage");

// Line 44
String permisos = (ChatColor.translateAlternateColorCodes('&', textpermisos));

String prefixtext = configuracion.getString("Configuration.Prefix");
String prefix = (ChatColor.translateAlternateColorCodes('&', prefixtext)); 

我必须修复此错误才能完成我的第一个插件。

Config.class:

import java.io.File;
import java.util.logging.Level;
import org.bukkit.configuration.file.YamlConfiguration;

public class Config {

    public static File configFile = new File("Plugins/LoginVip/config.yml");

    public static void load() {
        YamlConfiguration spawn = YamlConfiguration.loadConfiguration(configFile);   
    }
    public static void saveConfig() {
        YamlConfiguration configuracion = new YamlConfiguration(); 
        configuracion.set("Configuration.NoPermissionsMessage", "&cYou don't have permissions to do that");
        try {
            configuracion.save(configFile);
        } catch (Exception e) {
            LoginVip.log.log(Level.WARNING, "[LV] Error creating Config.yml file");
        }
    }
 }

onEnable:

@Override

    public void onEnable() {  
    log.log(Level.INFO, "[LV] Plugin loaded");
    if(!Config.configFile.exists()) {
      Config.saveConfig();
    }
    if(!Config.spawnFile.exists()) {
      Config.saveSpawn();
    }
      Config.load();
    }

1 个答案:

答案 0 :(得分:1)

textpermisosnull。来自MemoryConfiguration.getString(String)的Javadoc:

  

按路径获取请求的String。

     

如果String不存在但指定了默认值,则返回默认值。 如果String不存在且未指定默认值,则返回null。

这意味着您的配置文件不包含“Configuration.NoPermissionsMessage”的键值映射。它是null,然后传递到ChatColor.translateAlternateColorCodes(char, String)。这是它的源代码,我的注释表明崩溃日志中的哪一行ChatColor.java:206

/*
 * Translates a string using an alternate color code character into a
 * string that uses the internal ChatColor.COLOR_CODE color code
 * character. The alternate color code character will only be replaced if
 * it is immediately followed by 0-9, A-F, a-f, K-O, k-o, R or r.
 *
 * @param altColorChar The alternate color code character to replace. Ex: &
 * @param textToTranslate Text containing the alternate color code character.
 * @return Text containing the ChatColor.COLOR_CODE color code character.
 */
public static String translateAlternateColorCodes(char altColorChar, String textToTranslate) {
    char[] b = textToTranslate.toCharArray(); // textToTranslate is null, it causes a NPE to be thrown.
    for (int i = 0; i < b.length - 1; i++) {
        if (b[i] == altColorChar && "0123456789AaBbCcDdEeFfKkLlMmNnOoRr".indexOf(b[i+1]) > -1) {
            b[i] = ChatColor.COLOR_CHAR;
            b[i+1] = Character.toLowerCase(b[i+1]);
        }
    }
    return new String(b);
}

解决这个问题:

  • 添加默认映射,因此getString()不会返回null,而是返回默认值。这是一种方法(请参阅文档以申请HashMap):

    YamlConfiguration configuracion = YamlConfiguration.loadConfiguration(configFile);
    
    String defpermisos = "";
    String textpermisos = configuracion.getString("Configuration.NoPermissionsMessage", defpermisos);
    String permisos = ChatColor.translateAlternateColorCodes('&', textpermisos);
    
    String defprefix = "";
    String textprefix = configuracion.getString("Configuration.Prefix", defprefix);
    String prefix = ChatColor.translateAlternateColorCodes('&', textprefix);
    
  • 将代码修改为仅在!= null检查后翻译颜色代码。

    YamlConfiguration configuracion = YamlConfiguration.loadConfiguration(configFile);
    
    String textpermisos = configuracion.getString("Configuration.NoPermissionsMessage");
    String permisos = null;
    if (textpermisos != null)
        permisos = ChatColor.translateAlternateColorCodes('&', textpermisos);
    
    String prefixtext = configuracion.getString("Configuration.Prefix");
    String prefix = null;
    if (prefixtext != null)
        prefix = ChatColor.translateAlternateColorCodes('&', prefixtext);