Войти или зарегистрироваться

[Решено] java.lang.NoDefClassFoundError

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Всем доброго времени суток.

Столкнулся с проблемой, которую никак не могу решить. Чувствую, что ответ где-то рядом, но понять не могу =)

В общем, имею майн класс со следующим кодом:
Java:
package ru.coolboy.progadgets;

import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.plugin.java.JavaPlugin;

public class Main
extends JavaPlugin
{
    public FileConfiguration config;
    public static Main plugin;

    @Override
    public void onEnable()
    {
        plugin = this;
        config = this.getConfig();
        saveDefaultConfig();
        RandomFireworks.getManager().addColors();
        RandomFireworks.getManager().addTypes();
        this.getCommand("pg").setExecutor(new Commands());
        getServer().getPluginManager().registerEvents(new Listeners(), this);
        getLogger().info("enabled.");
    }

    @Override
    public void onDisable()
    {
       getLogger().info("disabled.");
    }
}

После этого имею код класса Configuration:
Java:
package ru.coolboy.progadgets.configurations;

import org.bukkit.ChatColor;

import ru.coolboy.progadgets.Main;

public class Configuration
{
    public static String RELOAD = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));
    public static String NO_PERMISSION = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.No-permissions"));
}

После обращения к классу Configuration в классе Commands посредством:
Java:
sender.sendMessages(Configuration.RELOAD);
Ловлю ошибку - java.lang.NoClassDefFoundError

Прошу помощи.
 
Последнее редактирование:
может ты кинешь стактрейс?)
 
может ты кинешь стактрейс?)
Легко
Java:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class ru.coolboy.progadgets.configurations.Configuration
    at ru.coolboy.progadgets.Listeners.onPlayerInteractWithDiamond(Listeners.java:59) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:300) ~[patched.jar:git-PaperSpigot-430]
    ... 19 more

59 строка моего листенера имеет следующий вид:

Java:
if (player.getItemInHand().getType() == Material.valueOf(Configuration.DIAMOND_FOUNTAIN_MATERIAL.toUpperCase()))
{
 
Последнее редактирование:
Легко
Java:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class ru.coolboy.progadgets.configurations.Configuration
    at ru.coolboy.progadgets.Listeners.onPlayerInteractWithDiamond(Listeners.java:59) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:300) ~[patched.jar:git-PaperSpigot-430]
    ... 19 more

59 строка моего листенера имеет следующий вид:

Java:
if (player.getItemInHand().getType() == Material.valueOf(Configuration.DIAMOND_FOUNTAIN_MATERIAL.toUpperCase()))
{
Ну ты и молодец, конечно. Класс Configuration подгружается вместе с плагином, по этому оно не может подгрузиться. Совет - в onEnable сетать эти значения.
 
Ну ты и молодец, конечно. Класс Configuration подгружается вместе с плагином, по этому оно не может подгрузиться. Совет - в onEnable сетать эти значения.
Каким образом?
Я почему так реализую конфигурацию то, у меня достаточно много исходников других проектов хранится. И этот метод самый удобный - как по мне. Странность в том, что абсолютно такой же метод работает в моём другом плагине отлично, без каких-либо ошибок.

Обновлено:

Да и в Main класс данные подгружать не получится. Они же все статичные.
Только если геттеры и сеттеры делать.
Up, проблема до сих пор не решена.
 
Последнее редактирование:
Проблема в Вас. Вы неправильно используете основные возможности Java(исправил). Чтобы помочь разобраться, нужен нормальный исходный код: тот что в первом посте - фигня полная(если Ваш код выглядит в реальности именно так, то у Вас проблемы с незнанием языка, на котором Вы программируете).
Скидывайте нормальные исходники, и Вам укажут на ошибки.
Конкретно нужны все куски кода, где Вы манипулируете классом Configuration.
 
Последнее редактирование:
Проблема в Вас. Вы неправильно используете синтаксис языка. Чтобы помочь разобраться, нужен нормальный исходный код: тот что в первом посте - фигня полная(если Ваш код выглядит в реальности именно так, то у Вас проблемы с незнанием языка, на котором Вы программируете).
Скидывайте нормальные исходники, и Вам укажут на ошибки.
Я не знаком с синтаксисом java на 100%) В этом и проблема, только поэтому я обратился сюда. Но никогда не поздно научиться. Через 10-20 минут я скину весь source code =)
 
Под "синтаксисом" я конечно же НЕ имел ввиду сам синтаксис Java, скорее - основы программирования на Java. Исправлю.
Я так понял, Вы хотите использовать статические переменные, так? Если так... мм. Я просто оставлю это здесь.
Java:
public class MyPlugin extends JavaPlugin
{
    public void onEnable()
    {
        Configuration.Load(getConfig());
    }
}

public class Configuration
{
    public static String RELOAD = "This is default reload message";

    public static void Load(FileConfiguration config)
    {
        Configuration.RELOAD = config.getString("message.reload-message", Configuration.RELOAD);
    }
}
 
Последнее редактирование:
Обновил топик. Смотрите =)
 
Статические ссылки губят.
Запили нормальную реализацию языка. А если у тебя и вправду две строки, то храни их в Main.
 
Статические ссылки губят.
Запили нормальную реализацию языка. А если у тебя и вправду две строки, то храни их в Main.
В том то и дело, что у меня там чуть больше 50 строк. Да и в каком смысле "нормальную" реализацию языка?
Мне просто нужно получать данные из конфига удобным способом. Так то я могу просто в нужном мне месте вот этот кусок вставить
Java:
Main.plugin.config.getString("Bla-bla-bla");
Но это не слишком то удобно и в плане читаемости кода и в плане реализации. Особенно, когда одну и ту же строчку нужно достать несколько раз.
 
В том то и дело, что у меня там чуть больше 50 строк. Да и в каком смысле "нормальную" реализацию языка?
Мне просто нужно получать данные из конфига удобным способом. Так то я могу просто в нужном мне месте вот этот кусок вставить
Java:
Main.plugin.config.getString("Bla-bla-bla");
Но это не слишком то удобно и в плане читаемости кода и в плане реализации. Особенно, когда одну и ту же строчку нужно достать несколько раз.
Лично мне удобнее работать с Properties. Просто загрузил в properties файл языка и вытаскивай текст как из HashMap.
 
Обновил топик. Смотрите =)
Вы не можете в объявлении статической переменной обращаться к еще не инициализированным полям других классов.
Используйте для этого отдельную функцию. Я привел пример.
 
Последнее редактирование:
После долгих манипуляций решил проблему из топика довольно просто.
И проблема была весьма странная.
В Configuration имел:
Java:
public static String RELOAD = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));

Вместе с ошибкой из топика кидало и эту ошибку:
Java:
Caused by: java.lang.NullPointerException
    at org.bukkit.ChatColor.translateAlternateColorCodes(ChatColor.java:324) ~[patched.jar:git-PaperSpigot-430]
    at ru.coolboy.showbowdamage.Configuration.<clinit>(Configuration.java:16) ~[?:?]
    ... 13 more
После того как изменил строчку на:
Java:
public static String RELOAD = Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));
Ошибка из топика изчезла.

Также после обьявления plugin = this, в класе Main, при обращении к нему из другого класса посредством plugin вы будете ловить null.
Решил костылём:
Java:
Main plugin = Main.plugin;
Всё отдуплилось.

@fall.us мой метод опять работает как нужно =D
Обновлено:
Всё прекрасно работает в моей реализации. Даже не знаю, насколько это плохо/костыльно, но тем неменее всё работает. Всем огромное спасибо за помощь =)

Тема закрыта.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх