2013-11-15 52 views
0

这是我的代码,做所有的工作:异常线程“main” java.util.InputMismatchException:使用扫描仪

import javax.swing.*;  
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import java.io.*; 
import java.lang.*; 
public class NFLStat extends JPanel 
{ 
static int count = 0; 

static QB[] qb; 

static JButton button; 

static String s, st, str, stri, strin, string, strings, stringst, stringstr, stringstri, stringstrin, stringstring, string1; 

public NFLStat() 
{ 
    button = new JButton("QB"); 
    button.addActionListener(new Listener()); 
    add(button); 

    Scanner infile = null; 
    try 
    { 
    infile = new Scanner(new File("Players")).useDelimiter("#"); 
    } 
    catch(FileNotFoundException e) 
    { 
    JOptionPane.showMessageDialog(null, "Error: File not found."); 
    System.exit(0); 
    } 
    while(infile.hasNext()) 
    { 
    qb[count] = new QB(infile.next(), infile.next(), infile.next(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextInt()); 
    count++; 
    } 

} 
public static class Listener implements ActionListener 
{ 
    public void actionPerformed (ActionEvent e) 
    { 
    JFrame frame = new JFrame("NFL Stats"); 
    JPanel panel = new JPanel(); 
    frame.add(panel); 
    frame.setSize(1000,400); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    for(int x = 0; x < count; x++) 
    { 
     s = Integer.toString(qb[x].getBye()); 
     st = Integer.toString(qb[x].getPAtt()); 
     str = Integer.toString(qb[x].getCmp()); 
     stri = Integer.toString(qb[x].getPyd()); 
     strin = Integer.toString(qb[x].getPtd()); 
     string = Integer.toString(qb[x].getInter()); 
     strings = Double.toString(qb[x].getRate()); 
     stringst = Integer.toString(qb[x].getRAtt()); 
     stringstr = Integer.toString(qb[x].getRyd()); 
     stringstri = Double.toString(qb[x].getAvg()); 
     stringstrin = Integer.toString(qb[x].getRtd()); 
     stringstring = Integer.toString(qb[x].getFL()); 
     string1 = Integer.toString(qb[x].getProj()); 
     JLabel label = new JLabel(qb[x].getName() + "|" + qb[x].getTeam() + "|" + qb[x].getUpcoming() + "|" + s +"|" + st + "|" + str + "|" + stri +"|"+ strin + "|" + string +"|" + strings + "|" + stringst + "|" + stringstr + "|" + stringstri + "|" + stringstrin + "|" + stringstring + "|" + string1); 
     panel.add(label); 
    } 
    } 
} 
public static void main(String[] args) throws Exception 
{ 
    JFrame frame = new JFrame("NFL Stats"); 
    frame.setSize(400,400); 
    frame.setLocation(200, 100); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setContentPane(new NFLStat()); 
    frame.setVisible(true); 

} 
} 

这是我的QB类,所以我可以用它的文本文档:

import javax.swing.*;  
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

public class QB 
{ 
private String name; 
private String team; 
private String upcoming; 
private int bye; 
private int Patt; 
private int cmp; 
private int Pyd; 
private int Ptd; 
private int inter; 
private double rate; 
private int Ratt; 
private int Ryd; 
private int avg; 
private int Rtd; 
private int fl; 
private int proj; 


public QB() 
{ 
    name = ""; 
    team = ""; 
    upcoming = ""; 
    bye = 0; 
    Patt = 0; 
    cmp = 0; 
    Pyd = 0; 
    Ptd = 0; 
    inter = 0; 
    rate = 0.0; 
    Ratt = 0; 
    Ryd = 0; 
    avg = 0; 
    Rtd = 0; 
    fl = 0; 
    proj = 0; 

} 
public QB(String n, String t, String u, int b, int p, int c, int y, int td, int i, double rat, int r, int yd, int a, int tdr, int f, int pro) 
{ 
    name =n; 
    team = t; 
    upcoming = u; 
    bye = b; 
    Patt = p; 
    cmp = c; 
    Pyd = y; 
    Ptd = td; 
    inter = i; 
    rate = rat; 
    Ratt = r; 
    Ryd = yd; 
    avg = a; 
    Rtd = tdr; 
    fl = f; 
    proj = pro; 
} 
//Get methods 
public String getName() 
{ 
    return name; 
} 
public String getTeam() 
{ 
    return team; 
} 
public String getUpcoming() 
{ 
    return upcoming; 
} 
public int getBye() 
{ 
    return bye; 
} 
public int getPAtt() 
{ 
    return Patt; 
} 

public int getCmp() 
{ 
    return cmp; 
} 

public int getPyd() 
{ 
    return Pyd; 
} 

public int getPtd() 
{ 
    return Ptd; 
} 

public int getInter() 
{ 
    return inter; 
} 

public double getRate() 
{ 
    return rate; 
} 

public int getRAtt() 
{ 
    return Ratt; 
} 


public int getRyd() 
{ 
    return Ryd; 
} 
public int getAvg() 
{ 
    return avg; 
} 
public int getRtd() 
{ 
    return Rtd; 
} 
public int getFL() 
{ 
    return fl; 
} 
public int getProj() 
{ 
    return proj; 
} 
} 

这是我的球员文本文档

Smith, Alex#KC#@Den#10#315#188#1919#9#4#81.4#53#265#5.0#1#0#145#Tannehill, Ryan#Mia#SD#6#331#202#2206#13#10#81.2#23#85#3.7#1#5#142#Bradford, Sam#STL#BYE#11#262#159#1687#14#4#90.9#15#31#2.1#0#1#142# 

程序编译,但我不断收到这个错误,当我尝试运行它:

Exception in thread "main" java.lang.NullPointerException 
at NFLStat.<init>(NFLStat.java:35) 
at NFLStat.main(NFLStat.java:76) 

有人可以帮我弄清楚有什么问题吗?

+0

请标注NFLStat.java第35行的确切行。另外,要生硬;在任何情况下,'s','st'等都是可怕的变量名。改用'byeString','pattString'等。 –

回答

2

感谢您发布的所有代码。我运行了几次,并找到了空指针异常的原因。

你声明你的领域:

static QB[] qb; 

,然后尝试把东西放到这个数组:

qb[count] = new QB(infile.next(), infile.next(), infile.next(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextInt()); 

但是,你从来没有真正初始化/创建这个数组。你需要像声明:

qb = new QB[3]; 

但是,当然,你想要的#这个数组里面永远是比你试图把它付诸表决什么相同或更多,否则你会得到一个空指针异常。

你有最大数量的玩家可以放入数组吗?使用该号码。或者限制你的while循环激发的次数,例如:

while(infile.hasNext() && count < 20) 

希望有所帮助! :-)

Kirsten

P.S.你发布的代码并没有立即为我编译,因为你的最终的infile.nextDouble()被馈入了一个期望int的构造函数中。我认为这是一个疏忽,因为你说你已经编译过了,你可能已经发布了,然后你在文件之间改变了一些东西。

+0

我发布了一个功能修复,但应详细说明一些其他已经提到的事情是很好的建议。使用尽可能多的类似参数创建一个构造函数通常是一个很好的指示器,它有一个更清晰的方法来完成你想要的任务,而且它也更容易调试。 (传递给构造函数而不是5+字符串的字符串数组就是一个很好的例子。) – kngrace

0

我不认为你应该做的:

qb[count] = new QB(infile.next(), infile.next(), infile.next(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextDouble(), infile.nextInt(), infile.nextInt(), infile.nextInt()); 

试着这么做

while (infile.hasnext()) 
    qb[i++] = (i == 9 || i = 12) ? infile.nextDouble() : infile.nextInt() ; 

不要忘了申报在这种情况下反,i

编辑:另外考虑保留一个字符串数组,而不是声明20个字符串名称。您可以节省大量时间,并提供更多的灵活性。

相关问题