2014-01-06 3 views
0

Прежде всего, извините за шведский в моем коде. Это школьное задание, и они написаны на шведском языке ... Надеюсь, код понятен.нет экземпляра типа Polylinje доступен в области

Я получаю эту ошибку на трех строках в своем коде и понятия не имею, почему.

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

В Java вы используете фразу Foo.this, чтобы ссылаться на охватывающий тип из анонимного класса. См. this question для более подробной информации.

У вас нет такой ситуации.

Основываясь на вашем последнем редактировании вопроса, вам нужно просто позвонить получателям. Например:

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; 
    } 
+0

, похоже, это сработало, но вместо этого дало некоторые «рекомендации» (желтые лампочки в затмении) в Polylinje.java. хотя все, кажется, работает, поэтому я надеюсь, что это правильно :) – morxy49

+0

@ user3165913 Из интереса, каковы рекомендации? –

+0

nope, когда я это сделал, я испортил код в некоторых других местах:/ Рекомендуемые рекомендации: «Статическое поле Polylinje.horn должно быть вставлено статическим способом» – morxy49

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, имя класса не требуется

+0

Также 'Polylinje.this.horn.length> 0' не будет компилироваться. 'horn()' является методом, но используется как 'поле'. – christopher

+0

спасибо! но теперь я получил новую ошибку в одних и тех же строках. «Звуковой сигнал не может быть разрешен или не является полем» – morxy49

+0

Вы, кажется, упустили тот факт, что окружающий класс называется «ПолилиньеИтератор», а не «Полилинье». –

0

Эспектор Polylinje.this.horn в вашем коде недействителен. Если вам нужен доступ к атрибуту horn в экземпляре класса Polylinje, вам необходимо сделать этот экземпляр доступным для класса PolylinjeIterator, возможно, присвоив ему атрибут класса Polylinje и инициализируя его в конструкторе PolylinjeIterator.

Вы также появляются использовать horn идентификатор тремя различными способами: как метод класса PolylinjeIterator, в качестве локальной переменной в этом методе и, возможно, в качестве атрибута класса Polylinje; это, вероятно, один из источников путаницы, который вы должны попытаться удалить.

0

Polylinje.this означает, что вы получаете доступ к этому экземпляру в классе Polylinje и/или внутри внутреннего класса Polylinje, это полезно, когда вы использовать внутри нестатического внутреннего класса (класс-член)/анонимный внутренний класс Polylinje.Решение заключается в создании экземпляра Polylinje в PolylinjeIterator и доступа horn через аксессуар или выполнить требуемую операцию в Polylinje или, возможно, объявить horn в PolylinjeIterator.

Смежные вопросы