NPE I can't solve :S

Discussion in 'Plugin Development' started by Datdenkikniet, Dec 3, 2013.

Thread Status:
Not open for further replies.
  1. So, I have this code (its a little long):
    code (open)

    Code:java
    1.  
    2. package me.datdenkikniet;
    3.  
    4. import java.io.File;
    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.util.logging.Level;
    8.  
    9. import me.datdenkikniet.events.ChatEvent;
    10. import me.datdenkikniet.resources.ticket.Ticket;
    11. import me.datdenkikniet.resources.ticket.Ticket.Status;
    12. import me.datdenkikniet.resources.ticket.Ticketer;
    13.  
    14. import org.bukkit.Bukkit;
    15. import org.bukkit.ChatColor;
    16. import org.bukkit.command.Command;
    17. import org.bukkit.command.CommandSender;
    18. import org.bukkit.configuration.file.FileConfiguration;
    19. import org.bukkit.configuration.file.YamlConfiguration;
    20. import org.bukkit.entity.Player;
    21. import org.bukkit.plugin.java.JavaPlugin;
    22.  
    23.  
    24.  
    25. public class Supertickets extends JavaPlugin{
    26. public CustomConfig c = new CustomConfig("messages");
    27. public void onLoad(){
    28. if (c.file != null){
    29. try {
    30. saveCustomConfig(c);
    31. } catch (Exception e){
    32. System.out.println("something went wrong!");
    33. }
    34. } else {
    35. saveDefaultConfig(c);
    36. }
    37. }
    38. public void onEnable(){
    39. System.out.println("We Have Enablisment!");
    40. Bukkit.getServer().getPluginManager().registerEvents(new ChatEvent(this), this);
    41. }
    42. public void onDisable(){
    43. System.out.println("We Have Disableshment");
    44. }
    45. int IdCount = 0;
    46. public String pr = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("SuperTickets prefix"));
    47. public String TicketNotificationOthers = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("ticket notification for others").replace("[PREFIX", pr));
    48. public String TicketNotification = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("ticket notification for creator").replace("[PREFIX", pr));
    49. public String ownsTicketAlready = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("already have a ticket message").replace("[PREFIX", pr));
    50. public String alreadyHelped = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("ticket already accepted message").replace("[PREFIX", pr));
    51. public String wrongUsage = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("wrong usage message").replace("[PREFIX", pr));
    52. public String ownTicketResolved = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("resolved your own ticket message").replace("[PREFIX", pr));
    53. public String NoTicketsAtAll = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("no open tickets message").replace("[PREFIX", pr));
    54. public String noTicket = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("don't own a ticket message").replace("[PREFIX", pr));
    55. public String noSuchTicket = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("this ticket does not exist message").replace("[PREFIX", pr));
    56. public String noperm = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("no permissions message").replace("[PREFIX", pr));
    57. public String ticketResolved = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("person you where helping closed ticket message").replace("[PREFIX", pr));
    58. public String secondArgNoNumber = ChatColor.translateAlternateColorCodes('&', getCustomConfig(c).getString("second argument not a number message").replace("[PREFIX", pr));
    59. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    60. if (label.equalsIgnoreCase("supertickets") || label.equalsIgnoreCase("st")){
    61. if (args.length == 0) {
    62. if (sender.hasPermission("supertickets.help") || sender.hasPermission("supertickets.*")) {
    63. sender.sendMessage(pr + ChatColor.GREEN + " The SuperTicket " + getDescription().getVersion().toString() + " Help menu!");
    64. if (sender.hasPermission("supertickets.help")|| sender.hasPermission("supertickets.*")) {
    65. sender.sendMessage(ChatColor.YELLOW + "/supertickets help " + ChatColor.DARK_AQUA + "displays this help menu!");
    66. sender.sendMessage(ChatColor.YELLOW + "/supertickets " + ChatColor.DARK_AQUA + "also displays this help menu!");
    67. }
    68. if (sender.hasPermission("supertickets.create")|| sender.hasPermission("supertickets.*")) {
    69. sender.sendMessage(ChatColor.YELLOW + "/supertickets create <question>" + ChatColor.DARK_AQUA + "creates a new ticket!");
    70. sender.sendMessage(ChatColor.YELLOW + "/supertickets leave" + ChatColor.DARK_AQUA + " makes you resolve your own ticket!");
    71. }
    72. if (sender.hasPermission("supertickets.accept")|| sender.hasPermission("supertickets.*")) {
    73. sender.sendMessage(ChatColor.YELLOW + "/supertickets accept <id>" + ChatColor.DARK_AQUA + " accepts a ticket!");
    74. }
    75. if (sender.hasPermission("supertickets.list")|| sender.hasPermission("supertickets.*")) {
    76. sender.sendMessage(ChatColor.YELLOW + "/supertickets list" + ChatColor.DARK_AQUA + " lists all active tickets with their id's, senders, and questions");
    77. }
    78. if (sender.hasPermission("supertickets.resolve")|| sender.hasPermission("supertickets.*")) {
    79. sender.sendMessage(ChatColor.YELLOW + "/supertickets resolve <id>" + ChatColor.DARK_AQUA + " marks a ticket as resolved!");
    80. }
    81. if (sender.hasPermission("supertickets.notify")|| sender.hasPermission("supertickets.*")) {
    82. sender.sendMessage(ChatColor.DARK_AQUA + "you also get notified when someone creates a ticket!");
    83. }
    84. return true;
    85. }
    86. sender.sendMessage(noperm);
    87. } else if (args.length == 1){
    88. if (args[0].equalsIgnoreCase("list")){
    89. if (sender.hasPermission("supertickets.list")|| sender.hasPermission("supertickets.*")){
    90. String f = pr + " all of the running tickets:\n <id>, <sender>, <question>";
    91. int count = 0;
    92. for (Ticket t: Ticketer.getTickets()){
    93. if (t.status == Status.UNSOLVED){
    94. f = f + "\n" + t.id + ", " + t.sender + ", \""+ t.question + "\"";
    95. count++;
    96. }
    97. }
    98. if (count != 0){
    99. sender.sendMessage(f);
    100. } else {
    101. sender.sendMessage(NoTicketsAtAll);
    102. return true;
    103. }
    104. return true;
    105. } else {
    106. sender.sendMessage(noperm);
    107. return true;
    108. }
    109. } else if (args[0].equalsIgnoreCase("help")){
    110. if (sender.hasPermission("supertickets.help")|| sender.hasPermission("supertickets.*")){
    111. sender.sendMessage(pr + ChatColor.GREEN + " The SuperTicket " + getDescription().getVersion().toString() + " Help menu!");
    112. if (sender.hasPermission("supertickets.help")|| sender.hasPermission("supertickets.*")) {
    113. sender.sendMessage(ChatColor.YELLOW + "/supertickets help " + ChatColor.DARK_AQUA + "displays this help menu!");
    114. sender.sendMessage(ChatColor.YELLOW + "/supertickets " + ChatColor.DARK_AQUA + "also displays this help menu!");
    115. }
    116. if (sender.hasPermission("supertickets.create")|| sender.hasPermission("supertickets.*")) {
    117. sender.sendMessage(ChatColor.YELLOW + "/supertickets create <question>" + ChatColor.DARK_AQUA + "creates a new ticket!");
    118. sender.sendMessage(ChatColor.YELLOW + "/supertickets leave" + ChatColor.DARK_AQUA + " makes you resolve your own ticket!");
    119. }
    120. if (sender.hasPermission("supertickets.accept")|| sender.hasPermission("supertickets.*")) {
    121. sender.sendMessage(ChatColor.YELLOW + "/supertickets accept <id>" + ChatColor.DARK_AQUA + " accepts a ticket!");
    122. }
    123. if (sender.hasPermission("supertickets.list")|| sender.hasPermission("supertickets.*")) {
    124. sender.sendMessage(ChatColor.YELLOW + "/supertickets list" + ChatColor.DARK_AQUA + " lists all active tickets with their id's, senders, and questions");
    125. }
    126. if (sender.hasPermission("supertickets.resolve")|| sender.hasPermission("supertickets.*")) {
    127. sender.sendMessage(ChatColor.YELLOW + "/supertickets resolve <id>" + ChatColor.DARK_AQUA + " marks a ticket as resolved!");
    128. }
    129. if (sender.hasPermission("supertickets.notify")|| sender.hasPermission("supertickets.*")) {
    130. sender.sendMessage(ChatColor.DARK_AQUA + "you also get notified when someone creates a ticket!");
    131. }
    132. return true;
    133. } else {
    134. sender.sendMessage(noperm);
    135. return true;
    136. }
    137. }
    138. else if (args[0].equalsIgnoreCase("leave")){
    139. if (sender.hasPermission("supertickets.create")|| sender.hasPermission("supertickets.*")){
    140. boolean ownsATicket = false;
    141. Ticket ticket = null;
    142. for (Ticket t: Ticketer.getTickets()){
    143. if (t.ownsTicket((Player)sender)){
    144. ownsATicket = true;
    145. ticket = t;
    146. break;
    147. }
    148. }
    149. if (ownsATicket){
    150. if (ticket.getHelper() != null){
    151. Bukkit.getPlayerExact(ticket.getHelper()).sendMessage(ticketResolved);
    152. }
    153. ticket.clear();
    154. sender.sendMessage(ownTicketResolved);
    155. return true;
    156. } else {
    157. sender.sendMessage(noTicket);
    158. return true;
    159. }
    160. } else {
    161. sender.sendMessage(noperm);
    162. return true;
    163. }
    164. } else {
    165. sender.sendMessage(wrongUsage);
    166. }
    167. } else if (args.length == 2){
    168. if (args[0].equalsIgnoreCase("accept")){
    169. if (sender.hasPermission("supertickets.accept")|| sender.hasPermission("supertickets.*")){
    170. int d = -1;
    171. try {
    172. d = Integer.parseInt(args[1]);
    173. } catch (NumberFormatException e){
    174. sender.sendMessage(secondArgNoNumber);
    175. return true;
    176. }
    177. Ticket ticket = null;
    178. for (Ticket t: Ticketer.getTickets()){
    179. if (t.getId() == d){
    180. ticket = t;
    181. break;
    182. }
    183. }
    184. try {
    185. if (ticket.status != Status.RESOLVED){
    186. if (ticket.helper == null){
    187. ticket.setHelper(sender.getName());
    188. ticket.setStatus(Status.BEING_HELPED);
    189. Player p = Bukkit.getPlayerExact(ticket.sender);
    190. sender.sendMessage(pr + " You are now helping " + ticket.sender + "!");
    191. p.sendMessage(pr + " " + sender.getName() + " is now helping you!");
    192. return true;
    193. } else {
    194. sender.sendMessage(alreadyHelped);
    195. }
    196. } else {
    197. sender.sendMessage(pr + " this ticket has been resolved already!");
    198. return true;
    199. }
    200. sender.sendMessage(pr + ChatColor.RED + " that ticket does not exist/has been resolved!");
    201. return true;
    202. }
    203. } else {
    204. sender.sendMessage(noperm);
    205. }
    206. } else if (args[0].equalsIgnoreCase("resolve")){
    207. if (sender.hasPermission("supertickets.resolve")|| sender.hasPermission("supertickets.*")){
    208. int d = -1;
    209. try {
    210. d = Integer.parseInt(args[1]);
    211. } catch (NumberFormatException e){
    212. sender.sendMessage(secondArgNoNumber);
    213. return true;
    214. }
    215. Ticket ticket = null;
    216. for (Ticket t: Ticketer.getTickets()){
    217. if (t.getId() == d){
    218. ticket = t;
    219. break;
    220. }
    221. }
    222. try {
    223. Player p = Bukkit.getPlayerExact(ticket.sender);
    224. sender.sendMessage(pr + " you closed " + ticket.sender + "'s ticket");
    225. p.sendMessage(pr + " " + sender.getName() + " closed your ticket!");
    226. ticket.clear();
    227. return true;
    228. } catch (Exception e){
    229. sender.sendMessage(noSuchTicket);
    230. return true;
    231. }
    232. }
    233. } else {
    234. sender.sendMessage(wrongUsage);
    235. }
    236. } else if (args.length >= 2){
    237. if (args[0].equalsIgnoreCase("create")){
    238. if (sender.hasPermission("superticket.create")|| sender.hasPermission("supertickets.*")){
    239. boolean hasTicket = false;
    240. for (Ticket t: Ticketer.getTickets()){
    241. if (t.sender == sender.getName()){
    242. hasTicket = true;
    243. }
    244. }
    245. if (!hasTicket){
    246. String ARGS = "";
    247. for (int i = 1; i < args.length; i++){
    248. if (ARGS.length() == 0){
    249. ARGS = args[i];
    250. } else {
    251. ARGS = ARGS + " " + args[i];
    252. }
    253. }
    254. Ticket ticket = new Ticket(sender.getName(), ARGS);
    255. ticket.id = IdCount;
    256. IdCount++;
    257. sender.sendMessage(TicketNotification.replace("[CREATOR]", sender.getName()).replace("[QUESTION]", ticket.question));
    258. for (Player p: Bukkit.getOnlinePlayers()){
    259. if (p.hasPermission("supertickets.notify")|| sender.hasPermission("supertickets.*")){
    260. String s = Integer.toString(ticket.id);
    261. p.sendMessage(TicketNotificationOthers.replace("[CREATOR]", ticket.sender).replace("[ID]", s).replace("[QUESTION]", ticket.question));
    262. }
    263. return true;
    264. }
    265. } else {
    266. sender.sendMessage(ownsTicketAlready.replace("[SENDER]", sender.getName()));
    267. return true;
    268. }
    269. } else {
    270. sender.sendMessage(noperm);
    271. return true;
    272. }
    273. } else {
    274. sender.sendMessage(wrongUsage);
    275. }
    276. } else {
    277. sender.sendMessage(wrongUsage);
    278. }
    279. }
    280. return false;
    281. }
    282. public class CustomConfig{
    283. public String name;
    284. public File file;
    285. public FileConfiguration fileConfig;
    286. public CustomConfig(String name){
    287. this.name = name;
    288. }
    289. }
    290. public FileConfiguration getCustomConfig(CustomConfig config) {
    291. if (config.fileConfig == null){
    292. reloadCustomConfig(config);
    293. }
    294. return config.fileConfig;
    295. }
    296. public void reloadCustomConfig(CustomConfig config) {
    297. if (config.fileConfig == null) {
    298. config.file = new File(getDataFolder(), config.name + ".yml");
    299. }
    300. config.fileConfig = YamlConfiguration.loadConfiguration(config.file);
    301.  
    302. InputStream defConfigStream = getResource(config.name + ".yml");
    303. if (defConfigStream != null) {
    304. YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
    305. config.fileConfig.setDefaults(defConfig);
    306. }
    307. }
    308. public void saveCustomConfig(CustomConfig config) {
    309. if (config.fileConfig == null || config.file == null) {
    310. return;
    311. }
    312. try {
    313. getCustomConfig(config).save(config.file);
    314. } catch (IOException ex) {
    315. getLogger().log(Level.SEVERE, "Could not save config to " + config.file, ex);
    316. }
    317. }
    318. public void saveDefaultConfig(CustomConfig config) {
    319. if (config.file == null) {
    320. config.file = new File(getDataFolder(), config.name + ".yml");
    321. }
    322. if (!config.file.exists()) {
    323. this.saveResource(config.name + ".yml", false);
    324. }
    325. }
    326. }
    327. [/i][/i]

    and for some reason, the InputStream on line 302 throws an NPE, which I can't solve...
    (if needed, here is the NPE thrown:

    errurzs! (open)

    Code:
    2013-12-03 20:17:37 [SEVERE] Could not load 'plugins\SuperTickets.jar' in folder 'plugins'
    org.bukkit.plugin.InvalidPluginException: java.lang.NullPointerException
    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:182)
    at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:305)
    at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:230)
    at org.bukkit.craftbukkit.v1_6_R3.CraftServer.loadPlugins(CraftServer.java:241)
    at org.bukkit.craftbukkit.v1_6_R3.CraftServer.<init>(CraftServer.java:219)
    at net.minecraft.server.v1_6_R3.PlayerList.<init>(PlayerList.java:56)
    at net.minecraft.server.v1_6_R3.DedicatedPlayerList.<init>(SourceFile:11)
    at net.minecraft.server.v1_6_R3.DedicatedServer.init(DedicatedServer.java:107)
    at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:393)
    at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)
    Caused by: java.lang.NullPointerException
    at org.bukkit.plugin.java.JavaPlugin.getResource(JavaPlugin.java:184)
    at me.datdenkikniet.Supertickets.reloadCustomConfig(Supertickets.java:302)
    at me.datdenkikniet.Supertickets.getCustomConfig(Supertickets.java:292)
    at me.datdenkikniet.Supertickets.<init>(Supertickets.java:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:178)
    ... 9 more
     
  2. Offline

    beastman3226

    You are referencing something that requires the plugin to be enabled. You cannot reference your instance of JavaPlugin until or after the onEnable() method is fired.
     
  3. 1Rogue yes, I did
    beastman3226 how would that make a difference? It's not used until onEnable is fired (or am I wrong and should I make all of those strings null, and set them in my onEnable to what they should be)
     
  4. Offline

    Blah1

    Why do people make mega classes? Split it up into different classes.
     
  5. Blah1 its all command shit (which I don't like to split), and the customConfig sucks when its seperate, so thats why I make mega classes :)
     
  6. Offline

    beastman3226

    Because the reference to the plugin is null until the PluginClassLoader calls onEnable. It does make a difference.

    Also, where do you declare your config field inside CustomConfig?

    It is also better to split classes. It is neater. Also, CustomConfig suckiness should not be affected by its placement. It is common coding etiquette to make an object such as a config in its own class. Also, commands can be neatified by giving it its own CommandExecutor class. There is really no difference. In addition, create a execute method in a separate class for each command. It just tidies things up. As far as expense does the JVM processing time is the addition of .001 nanos(a bit of an exaggeration).

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
Thread Status:
Not open for further replies.

Share This Page