簡體   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