2013-09-23 27 views
0

我正在写一个简单的命令行游戏。 我有很多功能和所有的功能,并且只会在这里发布。NullPointerException但编译?

问题:程序编译,但是当levelup()被调用并选择一个数字,我得到这个:

 You have 5 skill points to spend. 
     What would you like to upgrade? 
     [1:] STR      [2:] DEF 
1 
Exception in thread "main" java.lang.NullPointerException 
     at Game.levelup(cmdquest.java:300) 
     at Game.start(cmdquest.java:336) 
     at Menu.show_menu(cmdquest.java:195) 
     at cmdquest.main(cmdquest.java:263) 

这里是我的代码:

class Player{ 
    String name; 
    int hp; 
    int str; 
    int def; 
    String eff; 

    Player(String n) { 
    name = n; 
    hp = 100; 
    str = 1; 
    def = 1; 
    eff = "none"; 
    } 
} 


class Game{ 

    static Player p; 

    static void levelup(){ 
     while (points > 0){ 
      System.out.println("\t[1:]\tSTR\t\t\t[2:]\tDEF"); 
      int lvlup = kb.nextInt(); 

      switch (lvlup){ 
       case 1: p.str++; 
        break; 
       case 2: p.def++; 
        break; 
      } 

      points--; 
     } 

    //variables 
    static Scanner kb = new Scanner(System.in); 
    static int points = 5; 

    } 

static void start(){ 

     System.out.print("\t\t\t\tAnd so our adventure starts....."); 

     System.out.print("\tWhat's your name: "); 
     String nome = kb.next(); 
     Player p = new Player(nome); 

     System.out.println("\tHello " + p.name); 
     System.out.println("\tYou have 5 skill points to spend.\n\tWhat would you like to upgrade?"); 
     levelup(); 

    } 



class cmdquest{ 

public static void main(String args[]) throws Exception{ 

    Scanner kb = new Scanner(System.in); 

    //Importing foes.txt to create objects of foes 
    java.io.File file = new java.io.File("foes.txt"); 
    Scanner imp = new Scanner(file); 

    for(int i =0; i<3; i++){ 
     foes[i]=foe.leDados(imp); 
    } 
    //____________________________________________ 

    Game.start(); 

} 
} 

任何人都可以点我在正确的方向在这里? 我在做什么错?我觉得这是类“问题”类和“游戏”类中创建的对象。

+1

可能没有初始化'kb'或'p' –

+1

堆栈跟踪告诉你究竟在何处错误是。看看'cmdquest.java'的第299行。 –

+3

你能指定哪一行是299吗?此外,只是澄清 - 'NullPointerException'是一个运行时异常。这意味着它只会在运行时才会在编译期间被捕获。 –

回答

6

你得到一个NullPointerException,因为pnull。你在这里做什么:

Player p = new Player(nome); 

是声明本地变量p。静态类变量p未触及,因此它仍然为null

这被称为shadowing (JLS, Section 6.4.1)

一些声明可能在它们的范围的一部分由另一 声明具有相同名称的,在这种情况下,一个简单的名称不能 用于指所声明的实体被隐藏。

...

名为n型的声明d阴影任何 其他类型的命名n表示在范围在其中d在整个d的范围发生 点的声明。

删除Player,所以参考静态类变量p是你想要什么:

p = new Player(nome); 
+0

它的工作! 非常感谢! 我终于能够继续在这个项目上工作。 谢谢! –

相关问题