任何人都可以看到为什么我的toString()
方法不起作用?它编译得很好,但是当我运行它时会出现运行时错误:
这是我的代码:
import java.util.*;
public class ExamMarks {
// fields
private String moduleName;
private int moduleCode;
private int year;
private int[] numbers;
// methods
public static int highestMark(int[] numbers) {
int highest = numbers[numbers.length - 1];
int i = numbers[0];
for (i = 0; i < numbers.length - 1; i++) {
if (numbers[i] > numbers[i + 1]) {
highest = numbers[i];
}
}
return highest;
}
public static double averageMark(int[] numbers) {
int sum = 0;
double average = 0.000;
for (int i = 0; i < numbers.length; i++) {
sum = numbers[i] + sum;
average = sum / numbers.length;
}
return average;
}
// Constructor
public ExamMarks() {
moduleName = "Object Oriented Programming";
moduleCode = 5015;
year = 2013;
}
// toString
@Override
public String toString() {
String result = ("The title of this module is : " + moduleName
+ "The code number of this module is: " + moduleCode
+ "The year of the Exam is: " + year + "Array average = "
+ averageMark(numbers) + "Highest grade = " + highestMark(numbers));
return result;
}
// Tester
public static void main(String[] args) {
ExamMarks grade = new ExamMarks();
Scanner percentages = new Scanner(System.in);
int[] numbers = new int[20];
double x = averageMark(numbers);
System.out.println("Please enter 20 marks");
for (int i = 0; i < numbers.length; i++) {
numbers[i] = percentages.nextInt();
}
System.out.println(grade);
}
}
这是我得到的错误
java.lang.NullPointerException at ExamMarks.averageMark(ExamMarks.java:26)
at ExamMarks.toString(ExamMarks.java:42)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at ExamMarks.main(ExamMarks.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
答案 0 :(得分:3)
NullPointerException在这里。 private int [] number;
您的实例中的数字为空。
当你调用grade.toString()时,方法调用
public static double averageMark(int [] numbers){
int sum = 0;
double average = 0.000;
for (int i = 0; i < numbers.length; i++){ // !!!! numbers is null
答案 1 :(得分:0)
未设置“moduleName”,“moduleCode”和“year”字段。尝试在调用System.out.println(grade);
之前设置它们答案 2 :(得分:0)
您需要使toString()
功能适用于例外。
在最基本的级别,您可以在整个实现中添加try
和catch
,或者使函数averageMark(numbers)
和highestMark(numbers)
处理空指针异常。
答案 3 :(得分:0)
您从未设置private int [] numbers;
类的ExamMarks
字段。
numbers
方法中的 toString()
属于ExamMarks
类的实例,而numbers
中的main(...)
只是一个局部变量。
答案 4 :(得分:0)
averageMark(numbers);
直接。所以你用作参数的数字很好。
但是toString()方法也调用了这个方法,但是没有初始化的类字段'numbers'。
你必须使'数字'也是静态的,并为它设置一些值。
答案 5 :(得分:0)
在与+运算符连接之前,你应该检查你的成员是否是!= null。
如果你使用eclipse使用rightclick - &gt;来源 - &gt;生成toString()...它会在您的类中生成一个简单的toString
方法,您只需要更改文本。
通常效果很好,而且很容易使用。