我正在尝试在Java的上下文中学习面向对象的编程。我正在写一个相当简单的代码,但是我收到了这个错误:
Exception in thread "main" java.lang.NullPointerException
at Advisor_score.Rating.Score(Rating.java:12)
at Advisor_score.Rating.main(Rating.java:25)
这是我的代码:
package Advisor_score;
public class Rating {
double [] Ratings;
double sum;
double raw_advisor;
double advisor_score;
public Rating (double [] x){
double [] Ratings = x;
}
public double Score(){
for(int i=2;i<Ratings.length;i++){
sum+=Ratings[i];
}
raw_advisor=((sum-(3*(Ratings.length-2)))/4);
advisor_score= 2.5+(2.5*(1-Math.pow(Math.E, -.5*raw_advisor)));
return advisor_score;
}
public void print(){
System.out.println(advisor_score);
}
public static void main(String[] args){
double p1_1[] = {101,1,1,1.5,.5};
Rating d = new Rating(p1_1);
d.Score();
d.print();
}
}
我一直在看这几个小时,无法弄清楚代码的问题。我是编程新手,任何人都可以帮助我吗?提前谢谢!
答案 0 :(得分:11)
public Rating (double [] x){
double [] Ratings = x;
}
在这里,您要声明一个本地变量Ratings
并为其分配x
。之后,变量超出了范围。
您要做的是Ratings = x;
,它会将实例变量Ratings
设置为x
,而不是创建新的未使用的局部变量。
答案 1 :(得分:6)
这是您的代码,格式良好且修复了错误:
package com.yourdomain.advisor.score;
public class Rating{
double[] ratings;
double sum;
double rawAdvisor;
double advisorScore;
public Rating(final double[] x){
this.ratings = x;
}
public double score(){
for(int i = 2; i < this.ratings.length; i++){
this.sum += this.ratings[i];
}
this.rawAdvisor = (this.sum - 3 * (this.ratings.length - 2)) / 4;
this.advisorScore =
2.5 + 2.5 * (1 - Math.pow(Math.E, -.5 * this.rawAdvisor));
return this.advisorScore;
}
public void print(){
System.out.println(this.advisorScore);
}
public static void main(final String[] args){
final double p1_1[] = { 101, 1, 1, 1.5, .5 };
final Rating d = new Rating(p1_1);
d.score();
d.print();
}
}
您正在为未使用的局部变量而不是字段分配值。
我根据java惯例添加了一些更改:
请参阅Sun Java Naming Conventions
另外,请帮个忙:使用像Eclipse这样的IDE并在
上转换代码格式答案 2 :(得分:3)
因为您的类成员Ratings
未初始化,因此声明为NULL
。
并且你不能在NULL上执行方法
在构造函数中,您应该使用this.Ratings = x;
来初始化您尝试在score方法中使用的成员变量。
我建议你通过tutorials
答案 3 :(得分:3)
问题在于,你正在使用你已定义的新变量名称使用你所定义的变量名称,因此在调用得分时没有定义评级。
在你的构造函数中,你不应该重新定义它,只需使用它。
public Rating (double [] x){ Ratings = x; }
我认为这应该有用。
答案 4 :(得分:2)
你有两个同名的变量
更改
public Rating (double [] x){
double [] Ratings = x;
}
到
public Rating (double [] x){
Ratings = x;
}
答案 5 :(得分:0)
你有:
double [] Ratings;
什么是评级?需要初始化或设置一些非空值。
答案 6 :(得分:0)
问题来自于尝试引用在类顶部定义的Ratings
实例变量。这永远不会分配,因为在您的构造函数中,您正在创建本地变量 Ratings
并为其分配x
。然后立即丢弃局部变量,使Ratings
实例变量指向null
。
修复很简单:
public Rating (double [] x){
this.Ratings = x;
}
答案 7 :(得分:0)
在构造函数中,您将数组分配给局部变量而不是Ratings字段:
public Rating (double [] x){
double [] Ratings = x;
}
应该是
public Rating (double [] x){
Ratings = x;
}
甚至,如果你想更明确
public Rating (double [] x){
this.Ratings = x;
}
我还建议以这种方式利用评级,因为它违反了Java惯例,这使得它难以阅读;有关命名约定主题的更多信息,请访问Google。
答案 8 :(得分:0)
您的构造函数声明了一个隐藏实例变量的新变量Ratings。
包名称应以小写字母开头。
变量名称应以小写字母开头。
答案 9 :(得分:0)
我认为在构造函数中你的意思是初始化类成员public double [] Ratings,但是在构造函数中你创建了另一个double [] Ratings,它是构造函数的本地。将构造函数更改为
public Rating (double [] x){
double [] Ratings = x;
}
它会起作用