Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的空指针异常和作用域_Java_Oop - Fatal编程技术网

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 {

我试图在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();
    }
}
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;
    }