2016-01-30 2 views
0

Примечание: это не дубликат таких вопросов, как this, потому что они пытаются вызвать методы экземпляра для классов, а не экземпляров. Моя заключается в том, что я пытаюсь вызвать метод экземпляра для экземпляра, и он все еще дает ошибку.Java: Нестационарная переменная не может ссылаться на статический контекст при вызове экземпляра класса

Я получаю классическую ошибку, возникающую при попытке вызвать метод экземпляра для класса. Моя проблема в том, что я пытаюсь вызвать метод экземпляра для экземпляра, и я получаю эту ошибку. Мой код:

public class PixelsManipulation{ 

// Load in the image 
private final BufferedImage img = getImage("strawberry.jpg"); 
Sequential sequentialGrayscaler = new Sequential(img, 2, 2);//img.getWidth(),img.getHeight()); 

public static void main(String[] args) { 

    // Sequential: 
    long startTime = System.currentTimeMillis(); 

    sequentialGrayscaler.ConvertToGrayscale(); // error here 
    // ... etc. 
} 

Почему это может случиться? Есть ли что-то действительно очевидное, что я пропустил? Я объявил экземпляр Sequential, называемый sequentialGrayscaler, и я пытаюсь вызвать на нем ConvertToGrayscale(), а не сам класс.

Последовательный код просто:

public class Sequential { 
private int width, height; // Image params 
private BufferedImage img; 

// SEQUENTIAL 
// Load an image from file into the code so we can do things to it 

Sequential(BufferedImage image, int imageWidth, int imageHeight){ 
    img = image; 
    width = imageWidth; 
    height = imageHeight; 
} 

public void ConvertToGrayscale(){ 
// etc. 

EDIT: Если я закомментировать изображение и просто создать экземпляр объекта Sequential с целым Params, он работает. Поэтому проблема должна быть связана с BufferedImage.

Вот код, который я использую для чтения в изображениях:

private static BufferedImage getImage(String filename) { 
    try { 
     InputStream in = getClass().getResourceAsStream(filename); // now the error is here 
     return ImageIO.read(in); 
    } catch (IOException e) { 
     System.out.println("The image was not loaded. Is it there? Is the filepath correct?"); 
     System.exit(1); 
    } 
    return null; 
} 

Последнее место, где я могу «Погоня» ошибка в это линия, где я создаю InputStream. Ошибка есть «нестатический метод getClass() нельзя ссылаться из статического контекста». Это делается после объявления Sequential static вместе с методом ConvertToGrayscale(). Это после того, как говорят:

private static BufferedImage img = getImage("strawberry.jpg"); 
private static Sequential sequentialGrayscaler = new Sequential(img, 2, 2); 

И делает GetImage() статические, а также (что нужно сделать, что в противном случае я получаю ошибку, когда я пытаюсь создать BufferedImage).

EDIT: В конечном итоге мне просто пришлось перенести метод getImage() из моего основного класса и в класс Sequential. В идеале я не хотел этого делать, потому что это, вероятно, означает, что у меня будет много дублирующих методов getImage(), если я хочу реализовать их в других классах, но по крайней мере сейчас это работает.

+0

Попробуйте следующее: 'private static Sequential sequentialGrayscaler = new Sequential (img, 2, 2);' – user2004685

+0

Это устраняет ошибку в main(), но она просто перемещает ее в getImage(), когда я пытаюсь создать InputStream. – Touchdown

+0

Отправить этот ответ http://stackoverflow.com/questions/35094934/how-do-you-access-a-static-variable-of-an-object-in-java/35095535#35095535 – thedarkpassenger

ответ

1

Это потому, что и img, и sequentialGrayscaler объект PixelsManipulation Класс нестационарны. Измените их на статические.

private static BufferedImage img = getImage("strawberry.jpg"); 
private static Sequential sequentialGrayscaler = new Sequential(img, 2, 2); 

Кроме того, вы не можете сделать getClass().getResourceAsStream(...) от статического метода. Вместо этого используйте имя класса.

public class PixelsManipulation { 

    /* Your Code Here */ 

    private static BufferedImage getImage(String filename) { 
     try { 
      /* Code Change */ 
      InputStream in = PixelsManipulation.class.getResourceAsStream(filename); 
      return ImageIO.read(in); 
     } catch (IOException e) { 
      System.out.println("The image was not loaded. Is it there? Is the filepath correct?"); 
      System.exit(1); 
     } 
     return null; 
    } 
} 

Он должен начать работать нормально после выполнения этих изменений.

+0

Выполнение этой ошибки дает ту же ошибку, но с добавлением «Доступ к статическому методу ConvertToGrayscale». Даже если я изменил абсолютно все (все переменные и методы) на статические, это все равно произойдет. На самом деле, похоже, я получаю «цепочку», где ошибка просто сдвигается до тех пор, пока она не окажется в методе getClass() по умолчанию. – Touchdown

+0

Я следил за тем, что вы сказали, и перенес мой метод getImage() из моего основного класса и в класс Sequential. Он работает сейчас, но я не совсем понимаю, почему это не сработало, когда оно было в основном классе. В качестве еще одного примечания: класс Sequential не обязательно должен быть окончательным, но объект sequentialGrayscaler должен быть статическим. – Touchdown

+0

Он должен работать, даже если вы сохраните его в своем основном классе. – user2004685