Java StringSpacer方法中出现空指针异常错误

Java StringSpacer方法中出现空指针异常错误,java,nullpointerexception,Java,Nullpointerexception,一年前我为学校做了这个项目,它是一个基于基本文本的口袋妖怪竞技场。几天前我打开它给一些朋友看,发现一个空指针异常错误。当我一年前把它交上来的时候,它工作得非常好,从那以后我再也没有做过任何改变。我把displayTeam方法和stringSpacer方法都弄糟了,因为根据错误消息,问题似乎是从那里产生的 下面是我现在收到的错误消息: Exception in thread "main" java.lang.NullPointerException at Game.stringSpacer(Gam

一年前我为学校做了这个项目,它是一个基于基本文本的口袋妖怪竞技场。几天前我打开它给一些朋友看,发现一个空指针异常错误。当我一年前把它交上来的时候,它工作得非常好,从那以后我再也没有做过任何改变。我把displayTeam方法和stringSpacer方法都弄糟了,因为根据错误消息,问题似乎是从那里产生的

下面是我现在收到的错误消息:

Exception in thread "main" java.lang.NullPointerException
at Game.stringSpacer(Game.java:175)
at Game.displayTeam(Game.java:217)
at Game.choosePokemon(Game.java:166)
at PokemonFighter.main(PokemonFighter.java:9)
stringSpacer方法用于使文本与显示口袋妖怪团队统计数据的表格保持一致。以下是stringSpacer方法:

   172   public String stringSpacer(String str, int size){
   173   String before="";
   174   String after="";
   175   size-=str.length();
   176   size/=2;
   177   if(str.length()%2!=0){after+=" ";}
   178   for(int i=0;i<size;i++){
   179     before+=" ";
   180     after+=" ";
   181   }
   182   return before+str+after;
   183   }
   212  public void displayTeam(Pokemon[] team){
   213      System.out.println("\n|-NUM-|----POKEMON NAME----|--DEX--|--TYPE 1--|--TYPE 2--|--HP--|-SPEED--|-STATUS-|");
   214      for(int i=0; i<team.length;i++){
   215          String fnt="   OK   ";
   216          if(team[i].checkFaint()){fnt=" FAINT! ";}
   217/218          System.out.println("|  "+i+"  |"+stringSpacer(team[i].getName(),20)+"| "+team[i].getDex()+"  |"+stringSpacer(team[i].getType1(),10)+"|"+stringSpacer(team[i].getType2(),10)                     +"|"+stringSpacer(team[i].getHp()+"",6)+"|"+stringSpacer(team[i].getSpeed()+"",8)+"|"+fnt+"|");
   219      }
   220  }
   157   public void choosePokemon(){
   158      displayPokemon();
   159      System.out.println("Please Choose 3 Pokemon:");
   160      playerTeam[0] = new Pokemon(input.next());
   161      playerTeam[1] = new Pokemon(input.next());
   162      playerTeam[2] = new Pokemon(input.next());
   163      chooseOpponent();
   164      cleanSpace();
   165      System.out.println("YOUR TEAM:");
   166      displayTeam(playerTeam);
   167      System.out.println("\n\nOPPONENT'S TEAM:");
   168      displayTeam(comTeam);   
   169   }
口袋妖怪类构造函数和数据字段

     7   private String name, type1, type2, dex, ailment;
     8   private int hp, attack, defense, spAttack, spDefense, speed;
     9   private boolean faint=false;
    10   private int accuracy=100;
    11   private Attack[] moveset;
    12   private Random r = new Random();
    13   
    14   public Pokemon(String id) {
    15     /*
    16      * use Pokedex.txt for pokemon
    17      */
    18     moveset = new Attack[4];
    19     try{
    20         Scanner pokedex = new Scanner(new File("/Final Project/src/PokemonBattle/Pokedex.txt"));
    21        do{       if(pokedex.next().equals(id)){
    22              setDex(id);
    23              setName(pokedex.next());
    24              setType1(pokedex.next());
    25              setType2(pokedex.next());
    26              setHp(pokedex.nextInt());
    27              setAttack(pokedex.nextInt());
    28              setDefense(pokedex.nextInt());
    29              setSpAttack(pokedex.nextInt());
    30              setSpDefense(pokedex.nextInt());
    31              setSpeed(pokedex.nextInt());
    32              setMove(pokedex.next(),0);
    33              setMove(pokedex.next(),1);
    34              setMove(pokedex.next(),2);
    35              setMove(pokedex.next(),3);
    36              break;} 
    37      }while(pokedex.hasNextLine());  
    38      pokedex.close();
    39   }catch(Exception e){}
    40   this.iv();
    41   }
#Pokedex Name, Type1, Type2, HP, Attack, Defense, SpAttack, SpDefense, Speed, Attack 1 2 3 4
#Information from Pokemondb.net
000 Default null null 0 0 0 0 0 0 null null null null
003 Venusaur Grass Poison 80 82 83 100 100 80 Earthquake SludgeBomb EnergyBall DoubleEdge
006 Charizard Fire Flying 78 84 78 109 85 100 Inferno Crunch Slash AirSlash
009 Blastoise Water None 79 83 100 85 105 78 HydroPump Bite IceBeam Earthquake
042 Golbat Poison Flying 75 80 70 65 75 90 AirSlash Bite WingAttack PoisonFang
065 Alakazam Psychic None 55 50 45 135 85 120 GigaImpact Psychic Theif ThunderPunch
068 Machamp Fighting None 90 130 80 65 85 55 DynamicPunch ThunderPunch Earthquake Theif
080 Slowbro Water Psychic 95 75 110 100 80 30 Confusion Earthquake ShadowBall Surf
082 Magneton Electric Steel 50 60 95 120 70 70 ZapCanon GigaImpact FlashCannon Tackle
094 Gengar Ghost Poison 60 65 60 130 75 110 ShadowBall Theif DreamEater ShadowClaw
123 Scyther Bug Flying 70 110 80 55 80 105 XScissor AirSlash SteelWing Theif
124 Jynx Ice Psychic 65 50 35 115 95 95 Blizzard Psychic ShadowBall Pound
143 Snorlax Normal None 160 110 65 65 110 30 Crunch GigaImpact IceBeam Earthquake
口袋妖怪setType1方法

   193   public void setType1(String type1) {
   194      this.type1 = type1;
   195   }
   185   public void setName(String name) {
   186      this.name = name;
   187   }
口袋妖怪setName方法

   193   public void setType1(String type1) {
   194      this.type1 = type1;
   195   }
   185   public void setName(String name) {
   186      this.name = name;
   187   }
口袋妖怪文本文件

     7   private String name, type1, type2, dex, ailment;
     8   private int hp, attack, defense, spAttack, spDefense, speed;
     9   private boolean faint=false;
    10   private int accuracy=100;
    11   private Attack[] moveset;
    12   private Random r = new Random();
    13   
    14   public Pokemon(String id) {
    15     /*
    16      * use Pokedex.txt for pokemon
    17      */
    18     moveset = new Attack[4];
    19     try{
    20         Scanner pokedex = new Scanner(new File("/Final Project/src/PokemonBattle/Pokedex.txt"));
    21        do{       if(pokedex.next().equals(id)){
    22              setDex(id);
    23              setName(pokedex.next());
    24              setType1(pokedex.next());
    25              setType2(pokedex.next());
    26              setHp(pokedex.nextInt());
    27              setAttack(pokedex.nextInt());
    28              setDefense(pokedex.nextInt());
    29              setSpAttack(pokedex.nextInt());
    30              setSpDefense(pokedex.nextInt());
    31              setSpeed(pokedex.nextInt());
    32              setMove(pokedex.next(),0);
    33              setMove(pokedex.next(),1);
    34              setMove(pokedex.next(),2);
    35              setMove(pokedex.next(),3);
    36              break;} 
    37      }while(pokedex.hasNextLine());  
    38      pokedex.close();
    39   }catch(Exception e){}
    40   this.iv();
    41   }
#Pokedex Name, Type1, Type2, HP, Attack, Defense, SpAttack, SpDefense, Speed, Attack 1 2 3 4
#Information from Pokemondb.net
000 Default null null 0 0 0 0 0 0 null null null null
003 Venusaur Grass Poison 80 82 83 100 100 80 Earthquake SludgeBomb EnergyBall DoubleEdge
006 Charizard Fire Flying 78 84 78 109 85 100 Inferno Crunch Slash AirSlash
009 Blastoise Water None 79 83 100 85 105 78 HydroPump Bite IceBeam Earthquake
042 Golbat Poison Flying 75 80 70 65 75 90 AirSlash Bite WingAttack PoisonFang
065 Alakazam Psychic None 55 50 45 135 85 120 GigaImpact Psychic Theif ThunderPunch
068 Machamp Fighting None 90 130 80 65 85 55 DynamicPunch ThunderPunch Earthquake Theif
080 Slowbro Water Psychic 95 75 110 100 80 30 Confusion Earthquake ShadowBall Surf
082 Magneton Electric Steel 50 60 95 120 70 70 ZapCanon GigaImpact FlashCannon Tackle
094 Gengar Ghost Poison 60 65 60 130 75 110 ShadowBall Theif DreamEater ShadowClaw
123 Scyther Bug Flying 70 110 80 55 80 105 XScissor AirSlash SteelWing Theif
124 Jynx Ice Psychic 65 50 35 115 95 95 Blizzard Psychic ShadowBall Pound
143 Snorlax Normal None 160 110 65 65 110 30 Crunch GigaImpact IceBeam Earthquake
我想提前感谢大家对我的任何意见或建议


编辑:解决方案:未读取文本文件,因此
Pokemon
数组中的元素为空。必须遍历我的类并将路径从:
“/PokemonGame/Pokedex.txt”
更改为
“Pokedex.txt”
,对于
Movedex
文件也是如此。谢谢大家

我试图破译你的密码,但所有不相关的密码都很难破译。通常最好是给出涉及问题的代码子集,而不是给出整个程序并要求我们解决问题

说到这里,我发现了问题所在(至少是问题的结尾,而不是根源)

您正在将null传递到
stringSpacer
,如下所示

public String stringSpacer(str = null, int size){
    String before="";
    String after="";
    size-=str.length(); 
    size/=2; 
    if(str.length()%2!=0){after+=" ";}
    for(int i=0;i<size;i++){
        before+=" ";
        after+=" ";
    }
    return before+str+after;
}
我知道并不是所有传入
stringSpacer
的值都是空的,但其中一个是空的。因此,我认为你的问题在于你的口袋妖怪类。但是,如果没有该代码,很难说。

您可以避免它:

public String stringSpacer(String str, int size){
    if (str == null) return "";
...
或修复
team[i].getType1()
team[i].getType2()

您还可以使用
+“”
将它们转换为
“null”


有问题的变量是什么?哪一个变量是空的?你在这里发布了很多代码供人们浏览。你能消除一些不相关的东西吗?我假设方法
stringSpacer
的变量
str
为空。这意味着,
team[i]
(method
displayTeam
)中的口袋妖怪是一个有效实例,但它为其字段存储
null
值。你能给我们看看你的
Pokemon
课程吗?但也许不是全班同学。。。构造函数应该足够了。您需要学习如何调试NPE(NullPointerException)的一般概念。您应该仔细阅读异常的stacktrace,找到出错的代码行,即引发异常的代码行,然后仔细检查该行,找出哪个变量为null,然后回溯到代码中以了解原因。相信我,你会一次又一次地遇到这些问题。你能展示该
Pokedex.txt
文件的2或3个样本行吗?并检查是否在一行中输入if
if(pokedex.next().equals(id))
。如果不发生这种情况,您的所有字段都将保持
null
(或
0
false
)。确保他可以避免这种情况:修复他的
口袋妖怪
类。这种方法中的NPE意味着他在其他地方有问题。谢谢你的反馈!我将代码缩短了很多(很抱歉!),并为Pokemon类添加了构造函数和数据字段。问题可能是我没有正确地将记事本(.txt)文件导入Eclipse?我将它们作为文件系统导入,它们的路径在我的代码中是正确的。我不太确定,但再次非常感谢你!我会开始研究我的口袋妖怪课程。是的!在eclipse中使用调试器,查看Pokemon构造函数中的字段是否实际被填充。我怀疑你的问题与阅读文件有关。我发现这个问题有时会发生在eclipse中。此外,您还可以尝试使用javac sourcecode.java、java sourcecode单独编译/运行任何IDE