[英]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約定添加了一些更改:
請參見《 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.