NullPointerException beim Bilderladen

Hallo,
das Problem ist, dass das Programm zwar läuft, aber statt die Bilder zu laden eine java.lang.NullPointerException ausgibt.

import java.net.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

class Fenster extends Panel{
}
public class Socius extends Applet{
  
  public static Frame fenster;
  public Image soc1;
  public Image soc2;
  public MediaTracker tracker;
  
  public static void main(String[] args){
    fenster = new Frame("Socius");
    Socius calc = new Socius();
    calc.init();
    fenster.add(calc);
    fenster.pack();
    fenster.setSize(1600,865);
    fenster.setVisible(true); 
  }
  
  
  public void init(){
    Socius s = new Socius();    
    tracker = new MediaTracker(this);
    
    try { 
      soc1 = getImage(new URL("file:///c://Java//Socius//Socius1.png"));
      soc2 = getImage(new URL("file:///c://Java//Socius//Socius2.png"));
    } catch(Exception e) {
      System.err.println(e);   //Hier wird die java.lang.NullPointerException ausgegeben
    }    
    setBackground(Color.black);
    tracker.addImage(soc1, 0);
    tracker.addImage(soc2, 1);
    add(s);
    try { 
      tracker.waitForAll();
    } catch(InterruptedException e) {
      System.err.println(e);
    }    
  }
  public void start(){
    m_Thread thread1 = new m_Thread();
    thread.start();
  }
  class m_Thread extends Thread{
  }
      
  public void paint(Graphics g){
    g.drawImage(soc1, 0, 0, this);
    g.drawImage(soc2,5,100, this);
  }

  
  
}

Ich hab auch schon für die URL getCodeBase() verwendet, aber da gibts auch eine NullPointerException, aber das Programm startet nicht mal.
Hilfe!!!

Probier mal “file:///c:/Java/Socius/Socius2.png”

Funktioniert leider immernoch nicht

ich glaube der kann die Bilder nicht laden
ich sehe auch gerade dass du ja ein Applet hast
du musst die Bilder anders laden http://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen#Laden_von_Bildern_in_Applets

Aber wenn ich getCodeBase() verwende kommt das:

Exception in thread “main” java.lang.NullPointerException
at java.applet.Applet.getCodeBase(Unknown Source)
at Socius.init(Socius.java:38)
at Socius.main(Socius.java:22)

Das ist ein Applet, hat aber auch eine main - wie startest du das denn, als Applet oder als Anwendung? Grundsätzlich sollte man es mit getClass().getResourceAsStream() unabhängig von dieser Frage lösen können, aber sicher nicht mehr mit absoluten Pfaden. Dazu müßten die Bilder im richtigen Verzeichnis liegen, das auch mit getResourceAsStream() angesprochen werden kann…

Das Programm starte ich mit dem normalen Interpreter.
Das mit main hab ich gemacht, denn ich wollte die Applet-Funktionen, wie paint(), oder Threads, will es aber nicht als Applet auf eine Internetseite, sondern wenns fertig ist in eine exe packen.
Deinen Vorschlag musst du mir aber bitte nochmal genauer erklären.

Zeichnen und Threads verwenden kann man auch ohne Applet:
http://wiki.byte-welt.net/wiki/Malen_in_Swing_Teil_1:_der_grundlegende_Mechanismus
(und wenn du jetzt meinst, dass das vieeel komplizierter ist, als es mit dem Applet war: Ja, vielleicht. Aber so mit dem Applet ist es (in dieser Form!) eben nicht so toll…)

Das Laden mit getResourceAsStream bzw. getResource ist auch auf der schon verlinkten Seite beschrieben: http://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen#ImageIO (ja, es gibt viele Möglichkeiten, und welche die geeignetste ist, hängt vom Ziel ab…)

Warum eine exe? Dann ist dein Programm doch wieder plattformabhängig.
Java-Programme werden in Jar-Dateien ausgeliefert, die unter Windows auch mit einem Doppelklick ausführbar sind.

ich hab mir das mit ImageIO mal angeguckt und frage mich, was ist ein Inputstream?

Ein InputStream ist “irgendwas”, wovon man Daten lesen kann. Um aus einer Datei zu lesen, verwendet man einen FileInputStream. Aber das funktioniert mit Applets nur bedingt (und allgemein sind absolute Pfadangaben natürlich unsinnig - wer auch immer das ausführen soll, er hat mit Sicherheit nicht die Datei
c:\Java\Socius\Socius1.png
auf seinem Rechner…)

Noch der übliche Hinweis auf Websuchen und Dinge wie
http://openbook.galileocomputing.de/javainsel9/javainsel_17_001.htm#mjb420b02f4ccf65226f7271e48cefa05d

Ich habs jetzt so:

import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.awt.*;
import java.io.*;
     
public class Socius{
  
  public static JFrame fenster;
  public Image soc1;
  public Image soc2;
  
  public static void main(String[] args){
    fenster = new JFrame("Socius");
    Socius s = new Socius();
    fenster.pack();
    fenster.setSize(1600,865);
    fenster.setVisible(true);
  }
  public void laden(){
    try{
      soc1 = ImageIO.read(getClass().getRecource(new FileInputStream(new File("Socius.png"))));
      } catch(IOException e){;
      System.err.println(e);
      }
    }
    protected void paintComponent(Graphics g){
    g.drawImage(soc1, 0, 0, fenster);
    g.drawImage(soc2,5,100, fenster);
  }
  
}

Aber ich bekomm das da, beim compilieren:

Socius.java:22:37: error: cannot find symbol
soc1 = ImageIO.read(getClass().getRecource(new FileInputStream(new File(“Socius.png”))));
symbol: method getRecource(FileInputStream)
location: class Class<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Socius from capture of ? extends Socius

Es sollte wohl sowas wie
soc1 = ImageIO.read(getClass().getResource(“Socius.png”));
sein, wenn die “Socius.png” im gleichen Verzeichnis liegt, wie die Socius.class. Eigentlich ist das auf der Verlinkten Seite schon recht kompakt beschrieben.

Jetst hab ich das Problem, dass die Bilder noch nicht fertig geladen sind, wenn ich sie aufrufe.
Gibt es so eine Art MediaTracker für swing?

nee, hab mich vertan, passt alles, er zeigt bloss die Bilder nach 5 minuten immernoch nicht an,
mit wieviel Zeitaufwand muss ich rechnen, bzw. stimmt wieder irgendwas nicht?

import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.awt.*;
import java.io.*;
     
public class Socius{
  
  public static JFrame fenster;
  public Image soc1;
  public Image soc2;
  
  public static void main(String[] args) {
    fenster = new JFrame("Socius");
    Socius s = new Socius();
    fenster.pack();
    fenster.setSize(1600,865);
    fenster.setVisible(true);
    fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    s.laden();
  }
  public void laden(){
    System.out.println("Lade Bilder...");
    try{
      soc1 = ImageIO.read(getClass().getResource("Socius1.png"));
    } catch(IOException e){;
      System.err.println(e);
    }
  }  
  
  protected void paintComponent(Graphics g){

          g.drawImage(soc1, 0, 0, fenster);
          g.drawImage(soc2,5,100, fenster);
  }
  
}

ach ja, wenn ich versuche soc2 so:
soc2 = ImageIO.read(getClass().getResource(„Socius2.png“));
zu laden, kommt das:

Exception in thread „main“ java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at Socius.laden(Socius.java:26)
at Socius.main(Socius.java:20)
Obwohl das Bild EINDEUTIG vorhanden ist,
bitte Hilfe!!! :frowning:

Es dauert natürlich keine 5 Minuten. Bei ImageIO ist der MediaTracker praktisch schon drin. Das
input == null!
deutet darauf hin, dass er die Bilder nicht findet. Im Zweifelsfall mal ein bißchen mit den Pfaden rumprobieren, bzw. sicherstellen, dass die .PNG-Dateien nicht nur vorhanden sind, sondern auch im richtigen Verzeichnis liegen.

Hmm, aber er zeigt das bild auch nach 5 minuten nicht an(bzw. gibt auch keine fehlermeldung aus), was könnte Falsch sein? :confused:

Ja, warum sollte er auch die paintComponent aufrufen?

Es gibt zwei Möglichkeiten: Entweder man kopiert sich irgendwelche Schnipsel unverstanden zusammen, dann braucht man auch nicht nachzufragen. Oder man erarbeitet sich das, was notwendig ist, um Bilder anzeigen zu können. Dann werden Fragen auch angemessen beantwortet.

Was auch immer dein Ziel ist, hier mehr Code zum Copy&Pasten…

import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

class ImagePanel extends JPanel
{
    private Image soc1;
    private Image soc2;

    void setSoc1(Image soc1)
    {
        this.soc1 = soc1;
        repaint();
    }

    void setSoc2(Image soc2)
    {
        this.soc2 = soc2;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        if (soc1 != null)
        {
            g.drawImage(soc1, 0, 0, null);
        }
        if (soc2 != null)
        {
            g.drawImage(soc2, 5, 100, null);
        }
    }

}

public class Socius
{

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
    
    private static void createAndShowGUI()
    {
        JFrame fenster = new JFrame("Socius");
        
        ImagePanel imagePanel = new ImagePanel();
        imagePanel.setSoc1(load("image01.jpg"));
        imagePanel.setSoc2(load("image01.jpg"));
        fenster.getContentPane().setLayout(new GridLayout(1,1));
        fenster.getContentPane().add(imagePanel);
        
        fenster.setSize(1000, 800);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private static Image load(String name) 
    {
        try
        {
            return ImageIO.read(Socius.class.getResource(name));
        }
        catch (IOException e)
        {
            System.err.println(e);
            return null;
        }
    }

}```
  1. Dein Code funktioniert nicht( Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at Socius.load(Socius.java:78)
    at Socius.createAndShowGUI(Socius.java:64)
    at Socius.access$000(Socius.java:44)
    at Socius$1.run(Socius.java:54)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source) )

2.Ich will nicht nur abschreiben, sondern auch verstehen
3.NIEMAND hat mir gesagt wie ich paintComponent aufzurufen habe

Ich habs jetzt anders gelöst:

import javax.swing.*;
import javax.imageio.*;
import java.net.*;
import java.awt.*;
import java.io.*;
     
public class Socius{
  
  public static JFrame fenster;
  public Image soc1;
  public Image soc2;
  
  public static void main(String[] args) {
    fenster = new JFrame("Socius");
    Socius s = new Socius();
    fenster.pack();
    fenster.setSize(1600,865);
    fenster.setVisible(true);
    fenster.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    s.laden();
    SwingUtilities.invokeLater(new Runnable(){;
      public void run(){

      }
    });
  }
    public void laden(){
      Socius soc = new Socius();
      try{
        soc1 = ImageIO.read(getClass().getResource("Socius1.png"));
        soc2 = ImageIO.read(getClass().getResource("Socius2.png")); 
      } catch(IOException e){;
        System.err.println(e);
      }
      malen();
    }
    
    protected void malen(){
      Graphics g = fenster.getGraphics();
      System.out.println("Zeige Bilder an");
      g.drawImage(soc1, 0, 0, fenster);
      g.drawImage(soc2, 5, 100, fenster);
    }
    
  }

Viiiiiiiiiiiiiiiiielen Dank für eure Hilfe!
:smiley: