Java中的空指针异常和范围

时间:2010-09-14 15:50:32

标签: 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 {
    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();
    }
}

我一直在看这几个小时,无法弄清楚代码的问题。我是编程新手,任何人都可以帮助我吗?提前谢谢!

10 个答案:

答案 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惯例添加了一些更改:

  • 包名称是小写字母 和期间,并且应该反映您的域名
  • 类名在TitleCase
  • 方法,字段和局部变量 名字在camelCase

请参阅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;
    }

它会起作用