【问题标题】:I can't get my program to test: "java.lang.NullPointerException" [duplicate]我无法让我的程序进行测试:“java.lang.NullPointerException”[重复]
【发布时间】:2016-04-30 00:04:07
【问题描述】:

当我尝试运行程序时,这是计算机返回的结果:

First_Name Last_Name Test1 Test2 Test3 Test4 Test5 平均成绩

线程“main”中的异常 java.lang.NullPointerException at 测试.Tests.main(Tests.java:132) C:\Users\Michael Jr\AppData\Local\NetBeans\Cache\8.1\executor-sn-ps\run.xml:53:Java 返回:1 BUILD FAILED(总时间:0 秒)

package tests;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author Michael 
 */
public class Tests {

   private String fname;
    private String lname;
    private int[] scores;
 
    public Tests(String entry)
    {
        String[] data=entry.split(" ");
        scores=new int[data.length-2];
        this.setFname(data[0]);
        this.setLname(data[1]);
        for(int i=2;i<data.length;i++)
        {
            scores[i-2]=Integer.parseInt(data[i]);
        }
    }
    public int[] getScores() {
        return scores;
    }
    public void setScores(int[] scores) {
        this.scores = scores;
    }
 
    public static String getAverageScore(int[] a)
    {
        int sum=0;
        for(int e:a)
        {
            sum+=e;
        }
        return new DecimalFormat("##.##").format((double)sum/(double)a.length);
    }
 
    public static void showAverage(List<Tests> e)
    {
        for(Tests s:e)
        {
            System.out.println(s);
        }
    }
    public String getGrade()
    {
        double d=Double.parseDouble(Tests.getAverageScore(scores));
        if(d<=100 && d>=90)
        {
            return "A";
        }
        else if(d<90 && d>=80)
        {
            return "B";
        }
        else if(d<80 && d>=70)
        {
            return "C";
        }
        else if(d<70 && d>=60)
        {
            return "D";
        }
        else
        {
            return "F";
        }
    }
    public String getFname() {
        return fname;
    }
    public void setFname(String fname) {
        this.fname = fname;
    }
    public String getLname() {
        return lname;
    }
    public void setLname(String lname) {
        this.lname = lname;
    }
    public String toString()
    {
        return getFname()+"\t\t"+getLname()+"\t\t"+scores[0]+"\t\t"+scores[1]+"\t\t"+scores[2]+"\t\t"+scores[3]+"\t\t"+scores[4]+"\t\t"+getAverageScore(scores)+"\t\t"+getGrade();
    }
 
    public static ArrayList<Tests> read(String path)
    {
        BufferedReader br = null;
        try {
 
            String sCurrentLine;
            ArrayList<Tests> ar=new ArrayList<Tests>();
            br = new BufferedReader(new FileReader("C:\\Users\\Michael Jr\\Desktop\\ch9_Ex13Data.txt"));
 
            while ((sCurrentLine = br.readLine()) != null) 
            {
                ar.add(new Tests(sCurrentLine));
            }
            return ar;
 
        } 
        catch (Exception e) 
        {
 
        } 
        finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }
    public static void main(String[] a)
    {
        ArrayList<Tests> ar=read("E:/score.txt");
        System.out.println("First_Name\tLast_Name\tTest1\t\tTest2\t\tTest3\t\tTest4\t\tTest5\t\tAverage\t\tGrade");
        for(Tests e:ar)
        {
            System.out.println(e);
        }
    }
}
    

【问题讨论】:

  • 错误在第132行。那里的代码是什么?
  • 确实让你的程序编译了。否则,您永远不会遇到运行时异常,错误的,发生在运行时。

标签: java arrays nullpointerexception bufferedreader


【解决方案1】:

你应该检查你的读取函数的结果:

public static void main(String[] a)
    {
        ArrayList<Tests> ar=read("E:/score.txt");
        if (ar != null){  
            System.out.println("First_Name\tLast_Name\tTest1\t\tTest2\t\tTest3\t\tTest4 \t\tTest5\t\tAverage\t\tGrade");
            for(Tests e:ar)
            {
                System.out.println(e);
            }
        } else {
            System.out.println("Could not read file");
        }
    }

【讨论】:

  • 或者让read方法总是返回一个列表而不是null
  • 这解决了空问题,但现在无法读取文件?而且我的位置正好。
  • 您将“E:/score.txt”的值作为路径传递,但随后从“C:\\Users\\Michael Jr\\Desktop\”的硬编码路径中读取\ch9_Ex13Data.txt" - 你想读哪个文件?也许这是一个权限问题?
【解决方案2】:

您在验证try 语句吗?读取函数返回“Null”值。我认为这个问题是在您阅读文件时出现的。

String sCurrentLine;
        ArrayList<Tests> ar=new ArrayList<Tests>();
        br = new BufferedReader(new FileReader("C:\\Users\\Michael Jr\\Desktop\\ch9_Ex13Data.txt"));

        while ((sCurrentLine = br.readLine()) != null) 
        {
            ar.add(new Tests(sCurrentLine));
        }
        return ar;

如果你能分享文件,我会验证这段代码是否正确!

【讨论】:

  • 程序试图读取的文件内容如下。
  • 杰克·约翰逊 85 83 77 91 76 丽莎·安妮斯顿 80 90 95 93 48 安迪·库珀 78 81 11 90 73 拉维·古普塔 92 83 30 69 87 邦尼·布莱尔 23 45 96 38 59 丹尼·克拉克 70 85 45 39萨曼莎·肯尼迪 77 31 52 74 83 罗宾·布朗森 93 94 89 77 97 希拉·桑尼 79 85 28 93 82 基兰·史密斯 85 72 49 75 63 @Evinton
  • 当您使用十进制格式时,首先,在您的笔记本电脑或台式电脑中验证计算机编号格式。错误在这里DecimalFormat("##.##").format((double)sum/(double)a.length);更改'。'到“,”DecimalFormat("##,##").format((double)sum/(double)a.length);@mikeg4523
  • 修复 DecimalFormat("##,##").format((double)sum/(double)a.length) 后,它仍然给我相同的输出
  • 我认为问题在于读取功能,因为我一直在玩弄它,代码在此之前一直有效。我只是不明白为什么。
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2013-01-07
相关资源
最近更新 更多