Java中的空指针异常和作用域
我试图在Java环境中学习面向对象编程。我正在编写一个相当简单的代码,但遇到以下错误:Java中的空指针异常和作用域,java,oop,Java,Oop,我试图在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 {
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();
}
}
package Advisor\u评分;
公共等级评定{
双[]评级;
双和;
双原料顾问;
双倍的智商分数;
公众评级(双[]x){
双[]评级=x;
}
公众双倍得分(){
对于(int i=2;i,因为类成员的评级
没有初始化,所以它当前引用的是NULL
。
并且不能对NULL执行方法
在构造函数中,您应该使用this.Ratings=x;
,它将初始化您试图在score方法中使用的成员变量
我建议您查看,因为您的评分是您的类的成员,它没有初始化,只是声明了,所以它当前指的是NULL
。
并且不能对NULL执行方法
在构造函数中,您应该使用this.Ratings=x;
,它将初始化您试图在score方法中使用的成员变量
我建议您检查一下问题,您正在定义一个新的变量名称Ratings,而不是使用您已经定义的名称,因此在调用score时不定义Ratings
在构造函数中,您不应该重新定义它,而应该使用它
public Rating (double [] x){
Ratings = x;
}
公众评级(双[]x){
评级=x;
}
我认为这应该行得通。问题是,您正在定义一个新的变量名Ratings,而不是使用您已经定义的变量名Ratings,因此在调用score时不定义Ratings
public Rating (double [] x){
double [] Ratings = x;
}
在构造函数中,您不应该重新定义它,而应该使用它
public Rating (double [] x){
Ratings = x;
}
公众评级(双[]x){
评级=x;
}
我认为这应该行得通
public Rating (double [] x){
double [] Ratings = x;
}
在这里,您声明了一个局部变量Ratings
,并将x
赋值给它。紧接着,该变量超出了范围
您要做的是Ratings=x;
,这将把实例变量Ratings
设置为x
,而不是创建一个新的未使用的局部变量
在这里,您声明了一个局部变量Ratings
,并将x
赋值给它。紧接着,该变量超出了范围
您要做的是Ratings=x;
,这将把实例变量Ratings
设置为x
,而不是创建一个新的未使用的局部变量。您得到了两个同名变量
改变
public Rating (double [] x){
double [] Ratings = x;
}
到
有两个同名的变量
改变
public Rating (double [] x){
double [] Ratings = x;
}
到
这是您的代码,格式很好,错误已经修复:
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();
}
}
package com.yourdomain.advisor.score;
公共等级评定{
双[]评级;
双和;
双重顾问;
双重咨询;
公众评级(最终双[]x){
这是1.0=x;
}
公众双倍得分(){
对于(int i=2;i
您正在为未使用的局部变量而不是字段赋值
我根据java约定添加了一些更改:
- 包名称是小写字母
和句号,并应反映您的域名
- 类名在TitleCase中
- 方法、字段和局部变量
姓名在CAMELLE中
见
另外,帮你自己一个忙:使用类似IDE的工具,打开代码格式,这是你的代码,格式很好,错误已经修复:
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();
}
}
package com.yourdomain.advisor.score;
公共等级评定{
双[]评级;
双和;
双重顾问;
双重咨询;
公众评级(最终双[]x){
这是1.0=x;
}
公众双倍得分(){
对于(int i=2;i
您正在为未使用的局部变量而不是字段赋值
我根据java约定添加了一些更改:
- 包名称是小写字母
和句号,并应反映您的域名
- 类名在TitleCase中
- 方法、字段和局部变量
姓名在CAMELLE中
见
另外,帮自己一个忙:使用类似IDE的工具,打开代码格式设置
double [] Ratings;
什么是评级?需要初始化或设置一些非空值。您有:
double [] Ratings;
什么是额定值?需要初始化或设置一些非空值。问题源于试图引用在类顶部定义的额定值实例变量。这永远不会被指定,因为在构造函数中您正在创建一个局部变量额定值并将x
赋值给该变量。然后立即丢弃局部变量,留下
public Rating (double [] x){
double [] Ratings = x;
}