繁体   English   中英

Null指针异常和Java中的范围

[英]Null Pointer Exception and scope in Java

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

我已经看了好几个小时了,无法找出代码的问题。 我是编程新手,有人可以帮助我吗? 提前致谢!

public Rating (double [] x){
    double [] Ratings = x;
}

在这里,您要声明一个局部变量Ratings并为其分配x 此后,变量超出范围。

您想要做的是Ratings = x; ,这会将实例变量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();
    }
}

您正在将一个值分配给一个未使用的局部变量,而不是一个字段。

并且根据Java约定添加了一些更改:

  • 软件包名称仅是小写字母和句点,应反映您的域名
  • 类名称在TitleCase中
  • 方法,字段和局部变量名称在camelCase中

请参见《 Sun Java命名约定》

另外,帮自己一个忙:使用像Eclipse这样的IDE并打开代码格式设置

因为属于类成员的Ratings并未被初始化,所以它当前是指NULL 而且您无法在NULL上执行方法

在构造函数中,您应该使用this.Ratings = x; 这将初始化您要在评分方法中使用的成员变量。

我建议您阅读教程

问题在于,您正在使用已经定义的变量来定义一个新的变量名称Ratings int,因此在调用score时未定义Rating。

在构造函数中,您不应该重新定义它,而只是使用它。

public Rating (double [] x){
    Ratings = x;
        }

我认为这应该有效。

您有两个同名的变量

更改

 public Rating (double [] x){
      double [] Ratings = x;
 }

public Rating (double [] x){
    Ratings = x;
}

你有 :

double [] Ratings;  

什么是评分? 需要初始化或设置一些非null值。

问题来自尝试引用在类顶部定义的Ratings 实例变量 这是永远不会分配给的,因为在构造函数中您正在创建局部变量 Ratings并为其分配x 然后,立即丢弃该局部变量,使Ratings实例变量指向null

解决方法很简单:

public Rating (double [] x){
  this.Ratings = x;
}

在构造函数中,您正在将数组分配给局部变量,而不是Ratings字段:

public Rating (double [] x){
    double [] Ratings = x;
}

应该

public Rating (double [] x){
    Ratings = x;
 }

甚至,如果您想更加明确

public Rating (double [] x){
    this.Ratings = x;
}

我还建议以大写形式使用Ratings,因为它违反Java约定,这使它难以阅读。 google以获取有关命名约定主题的更多信息。

您的构造函数声明了一个新的变量Ratings,该变量隐藏了实例变量。

软件包名称应以小写字母开头。

变量名称应以小写字母开头。

我认为在构造函数中,您打算初始化类成员public double [] Ratings,但是在构造函数中,您将创建另一个double [] Ratings,它是构造函数的局部变量。

public Rating (double [] x){
double [] Ratings = x;
    }

会工作的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM