首先,在我的代码中抱歉瑞典语。这是一项学校作业,用瑞典语写成......我希望代码是可以理解的。
我在代码的三行中出现此错误,并且不知道原因。
no enclosing instance of the type Polylinje is accessible in scope
我的代码是:
public class PolylinjeIterator {
private int aktuell = -1;
public PolylinjeIterator (){
if (Polylinje.this.horn.length > 0) // ERROR HERE!
aktuell = 0;
}
public boolean finnsHorn (){
return aktuell != -1;
}
public Punkt horn ()
throws java.util.NoSuchElementException{
if (!this.finnsHorn ())
throw new java.util.NoSuchElementException (
"slut av iterationen");
Punkt horn = Polylinje.this.horn[aktuell]; // ERROR HERE!
return horn;
}
public void gaFram (){
if (aktuell >= 0 &&
aktuell < Polylinje.this.horn.length - 1) // ERROR HERE!
aktuell++;
else
aktuell = -1;
}
}
Polylinje.java中的代码如下所示:
import java.util.Arrays;
public class Polylinje {
// Instansvariabler
// En tom Polylinje
private Punkt[] horn;
// Polylinjens färg
private String farg = "svart";
// Polylinjens bredd
private int bredd = 1;
// Konstruktorer
// Polylinje skapar en Polylinje utan hörn
public Polylinje () {
this.horn = new Punkt[0];
}
// Polylinje skapar en Polylinje med argument
public Polylinje (Punkt[] horn, String farg, int bredd)
{
this.horn = new Punkt[horn.length];
for (int i = 0; i < horn.length; i++)
this.horn[i] = new Punkt (horn[i]);
this.farg = farg;
this.bredd = bredd;
}
public Polylinje (Punkt[] horn)
{
this.horn = new Punkt[horn.length];
for (int i = 0; i < horn.length; i++)
this.horn[i] = new Punkt (horn[i]);
}
// Konvertorer
//
public String toString () {
String s = "";
s = "{"+Arrays.toString(horn)+", "+farg+", "+bredd+"}";
return s;
}
// Inspektorer
// getHorn returnerar hörnen i form av Punkt-array.
public Punkt[] getHorn () {return horn;}
// getFarg returnerar färgen i form av en String.
public String getFarg () {return farg;}
// getBredd returnerar bredden i form av en integer.
public int getBredd () {return bredd;}
// Mutatorer
// setFarg låter dig ange färgen på en Polylinje.
public void setFarg (String farg) {this.farg = farg;}
// setBredd låter dig ange bredden på en Polylinje.
public void setBredd (int bredd) {this.bredd = bredd;}
// langd beräknar längden på en Polylinje.
public double langd () {
double langd = 0;
double d = 0;
for (int i = 0; i < (horn.length-1); i++){
d = horn[i].avstand (horn[i+1]);
langd += d;
}
return langd;
}
// laggTill lägger till en linje i slutet av Polylinjen
public void laggTill (Punkt horn) {
Punkt[] h = new Punkt[this.horn.length + 1];
int i = 0;
for (i = 0; i < this.horn.length; i++)
h[i] = this.horn[i];
h[i] = new Punkt (horn);
this.horn = h;
}
// laggTillFramfor lägger till en linje framför en vald linje
public void laggTillFramfor (Punkt horn, String hornNamn)
{
int pos = -1;
for(int i = 0; i < this.horn.length; i++){
if(this.horn[i].namn == hornNamn){
pos = i;
break;
}
}
Punkt[] h = new Punkt[this.horn.length + 1];
for (int j = 0; j < pos; j++)
h[j] = this.horn[j];
for (int k = pos+1; k < h.length; k++)
h[k] = this.horn[k-1];
h[pos] = new Punkt (horn);
this.horn = h;
}
//
public void taBort (String hornNamn) {}
}
答案 0 :(得分:0)
如果要在Polylinje
内引用PolylinjeIterator
的实例,则需要将PolylinjeIterator
的实例传递给构造函数:
public PolylinjeIterator (Polylinje polylinjeInstance){
if (polylinjeInstance.horn().length > 0) // Assuming Punkt has a length member and horn is a method in Polylinje
aktuell = 0;
}
如果要在Polylinje
类的不同位置使用PolylinjeIterator
,请创建一个类成员,并在构造函数中将给定实例分配给此成员。然后使用PolylinjeIterator
课程中的成员。
使用Polylinje.this
没有意义,因为Classes
没有自己的成员作为实例。该实例是您创建的类的具体实体,因此每当您引用this
时,都不需要类名
答案 1 :(得分:0)
代码中的espression Polylinje.this.horn
无效。如果您需要访问类horn
实例中的Polylinje
属性,则需要使类PolylinjeIterator
可以访问此实例,方法是为其提供类Polylinje
的属性并在PolylinjeIterator
的构造函数中初始化它。
您似乎也以三种不同的方式使用horn
标识符:作为类PolylinjeIterator
的方法,作为此方法中的局部变量,并且可能作为类Polylinje
的属性;这可能是您应该尝试删除的混淆的一个原因。
答案 2 :(得分:0)
在Java中,您使用短语Foo.this
来引用匿名类中的封闭类型。有关详细信息,请参阅this question。
你不是这种情况。
根据您最新的问题编辑,您只需要调用getter。 E.g:
if (Polylinje.this.horn.length > 0) // ERROR HERE!
应该成为:
if (polylinje.getHorn().length > 0)
如果您的类中有一个名为polylinje
的字段,您可以在构造函数中插入该字段,例如:
public class PolylinjeIterator {
private int aktuell = -1;
private final Polylinje polylinje;
public PolylinjeIterator (Polylinje polylinje){
this.polylinje = polylinje;
if (polylinje.getHorn().length > 0)
aktuell = 0;
}
答案 3 :(得分:0)
Polylinje.this
表示您正在访问Polylinje
类和/或Polylinje
内部类中的'this'实例,当您在非静态内部使用时,这非常有用class(成员类)/ Polylinje
的匿名内部类。解决方案是在Polylinje
中创建PolylinjeIterator
的实例并通过访问者访问horn
或在Polylinje
中执行所需的操作,或者在horn
中声明PolylinjeIterator
{{1}}。