YAMLException - HelmDefense/HelmDefense GitHub Wiki
Cette exception est levée lorsqu'une erreur intervient sur de la lecture ou de l'écriture de données avec la librairie SnakeYAML
. Elle signifie que quelque chose ne s'est pas passé comme prévu et que soit des données n'ont pas été correctement chargées, soit pas correctement sauvegardées. Dans les deux cas il s'agit d'une exception fatale.
Actuellement, les données des entités et des niveaux étant stockées directement à l'intérieur de l'archive JAR, tant que l'utilisateur n'a pas modifié les données à la main il n'est normalement pas possible qu'elle soit levée à ce moment là.
En revanche, si l'accès au dossier "home" de l'utilisateur n'est pas possible pour une raison X ou Y, lors de la sauvegarde ou le chargement des options cette exception peut arriver.
Enfin, il est possible (si vous avez essayé de modifier le JAR, et notamment les données des entités) que ces dernières soit erronées et devenues illisibles, ce qui déclenche cette exception.
Comme expliqué plus haut, il n'est normalement pas possible d'avoir cette exception si vous n'avez pas édité le JAR. Si c'est le cas, téléchargez une version propre. Sinon, ou si le problème persiste, essayez de vérifier les droits d'accès sur votre dossier /Users/<username/
sur Linux et MacOS et C:\Users\<username>\
sur Windows.
Il n'y a actuellement aucune fonctionnalité dans le code qui analyseraient pourquoi l'exception a été levée, mais il serait envisageable de concevoir un système qui demande automatiquement à l'utilisateur de sélectionner un autre emplacement de sauvegarde (le principal problème est qu'il faudrait se souvenir de cet emplacement, et donc le stocker, mais où puisqu'on ne peut pas le stocker à l'emplacement justement...).
Voici quelques exemples extraits des classes du package fr.helmdefense.yaml
.
private static void loadOptions() { File options = new File(YAMLWriter.STORAGE, YAML.DATA_FOLDER + "/options.yml"); if (! options.exists()) { try { YAMLWriter.saveDefaultOptions(); } catch (IOException e) { throw new YAMLException("Failed to save default options", e); } loadedOptions = YAMLLoader.load(YAML.DATA_FOLDER + "/options.yml"); } else { loadedOptions = YAMLLoader.loadAbsolute(options.getAbsolutePath()); } }Exemple d'utilisation : Le chargement des options depuis la classe
YAMLLoader
public static YAMLData loadAbsolute(String file) { try { return new YAMLData(YAML.get().load(new FileReader(file))); } catch (FileNotFoundException e) { throw new YAMLException("Cannot load file \"" + file + "\"", e); } }Exemple d'utilisation : Le chargement d'un fichier
yml
depuis la classeYAMLLoader
try { FileWriter writer = new FileWriter(STORAGE + "/" + YAML.DATA_FOLDER + "/options.yml"); YAML.get().dump(data, writer); } catch (IOException e) { throw new YAMLException("Failed to save options in file \"" + STORAGE + "/" + YAML.DATA_FOLDER + "/options.yml\"", e); }Exemple d'utilisation : La sauvegarde du fichier
options.yml
depuis la classeYAMLWriter
(simplifiée)
public int getInt(String path, int def) { Object obj = this.get(path); try { return obj == null ? def : ((Number) obj).intValue(); } catch (ClassCastException e) { throw new YAMLException("Cannot return data in specified format!", e); } }Exemple d'utilisation : La récupération d'un entier depuis un ensemble de données
yml
depuis la classeYAMLData
Nous pouvons noter dans la classe YAMLLoader
(principalement) d'autres cas de gestion d'exceptions, mais d'exceptions "classiques" (IllegalArgumentException
, IndexOutOfBoundsException
, etc...), que je tenais tout de même à souligner. En voici un exemple :
private static List<Object> abilitiesParams(List<?> data) { List<Object> list = new ArrayList<Object>(data); try { list.set(0, Tier.valueOf(list.get(0).toString().toUpperCase())); } catch (IllegalArgumentException | IndexOutOfBoundsException e) { list.add(0, Tier.DEFAULT); } try { list.set(1, Tier.Specification.valueOf(list.get(1).toString().toUpperCase())); } catch (IllegalArgumentException | IndexOutOfBoundsException e) { list.add(1, Tier.Specification.DEFAULT); } return list; }Exemple d'utilisation : L'analyse des paramètres pour les capacités (afin de rendre le tier facultatif dans le
game_data/entities.yml
) depuis la classeYAMLLoader