2014-10-10 62 views
-3

这是我为蛇和阶梯写的代码。请帮助我解决例外问题。例外情况在第72和114行。我已经突出显示了导致异常的评论。感谢提前寻求帮助。如何解决java.lang.NullPointerException?

package practical1; 

import java.io.Console; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class snakeandladder1 { 

int totalpos=100; 
int v=0; 
int[] scores; 
int score=0; 
int l=0; 

public int throwdice() 
{ 
    int i=0; 
    { 
     while(i==0) 
     { 
      i=(int)Math.random()*100; 
      i=i%13; 
     } 
     return i; 
    } 
} 

public int ladder(int score) 
{ 
    if(score==15) 
     score=30; 
    else if(score == 45) 
     score=71; 
    else if(score == 25) 
     score=62; 
    else if(score == 81) 
     score=91; 
    else if(score == 9) 
     score=39; 
    scores[l]=score; 
    return score; 
} 

public int snake(int score) 
{ 
    if(score == 29) 
     score=11; 
    else if(score == 81) 
     score=48; 
    else if(score == 92) 
     score=71; 
    else if(score == 30) 
     score=6; 
    else if(score == 58) 
     score=19; 
    scores[l]=score; 
    return score; 
} 

void start() 
{ 
    System.out.println("Enter the number of players:"); 
    Scanner in=new Scanner(System.in); 
    int n=in.nextInt(); 
    in.close(); 
    l=n; 
    System.out.println("Enter Players names in order:"); 
    ArrayList<String> name1=new ArrayList<String>(); 
    for (int i=0;i<n;i++) 
    { 
     Console in1=System.console(); 
     String name2=in1.readLine(); //---- I am getting this null pointer exception here. 
     name1.add(name2); 
    } 
    while(true) 
    { 
     while(l>0) 
     { 
      System.out.println("Click y to roll dice %d"+(l+1)); 
      Console in2=System.console(); 
      String yes=in2.readLine(); 
      if (yes == "y") 
      { 
       v=throwdice(); 
      } 
      score = scores[l]+v; ((//--- the null pointer exception after changing all user input   to scanner)) 
      if(score==totalpos) 
      { 
       System.out.println("User:"+name1.get(l)+" got "+v+".Winner!!!"); 
       break; 
      } 
      else if(score > totalpos) 
      { 
       scores[l]=scores[l]; 
      } 
      int s1; 
      s1=ladder(score); 
      if(s1==score) 
      { 
       snake(score); 
      } 
      System.out.println("Current score of"+name1.get(l)+"is:"+scores[l]); 
      l--; 
     } 
     if(l==0) 
     { 
      l=n; 
     } 
    } 
} 
public static void main(String[] args) throws Exception{ 
    // TODO Auto-generated method stub 
    snakeandladder1 sal=new snakeandladder1(); ((//null pointer exception here as well after the changes)) 
    sal.start(); //------ i am getting this null pointer exception here 
} 

}

+1

尝试'新的扫描仪(System.in)'读取从标准输入流的输入。阅读[JavaDoc](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#console%28%29) - *返回与当前Java虚拟相关的唯一控制台对象机器,如果有的话,否则'空'。* – Braj 2014-10-10 18:43:07

+3

你能分享你的完整堆栈跟踪吗? – Mureinik 2014-10-10 18:44:45

+0

为什么你同时使用'in'和'in1'?两个对象基本相同(从控制台输入)...使用'in'并放弃'in1' – Barranka 2014-10-10 18:45:16

回答

1
Scanner in=new Scanner(System.in); 
int n=in.nextInt(); 
in.close(); 

请未在上面的代码close()方法将关闭不仅Scanner对象本身而且其强调流(即键盘输入)。这发生在System.in和实现Readable的所有其他来源。

the docs

扫描器被关闭时,它会如果源 实现可关闭接口关闭其输入源。

我的建议:

  • 删除in.close();
  • 使用name2 = in.readLine();
+0

嗨...感谢您的帮助。我弄清了这些问题并了解了sacanner对象的工作,这是堆栈跟踪:输入玩家的数量:为了输入玩家名字:线程“main”显示java.lang.NullPointerException \t在practical1.snakeandladder1.start 异常(snakeandladder1.java:72 ) \t at practical1.snakeandladder1.main(snakeandladder1.java:114) – 2014-10-11 06:15:32

+0

嗨...现在我又一个问题...同样的问题发生与其他两个线..与83和115线..这里是堆栈追踪:输入玩家人数:为了输入玩家名称: 基尚 RAGHAV 点击y以掷骰子%D3 Ÿ 异常线程 “main” 显示java.lang.NullPointerException \t在practical1.snakeandladder1.start(snakeandladder1。java:85) \t at practical1.snakeandladder1.main(snakeandladder1.java:113) – 2014-10-11 06:20:47

+0

我不明白的是如何清除这个异常。异常是为空pionter变量或对象,但我还没有分配任何变量或对象null。请帮助.... – 2014-10-11 06:23:11

相关问题