2014-02-23 81 views
0

我參加這個迷你Ludum敢#49java.lang.IllegalArgumentException異常:輸入== NULL

我跑的時候有我的代碼,這樣做,但我有一個問題(以及一些)和編譯。

我在控制檯 「

java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at com.cmnatic.mld.GameState.IntroState.init(IntroState.java:31) 
    at com.cmnatic.mld.Manager.GameStateManager.setState(GameStateManager.java:46) 
    at com.cmnatic.mld.Manager.GameStateManager.<init>(GameStateManager.java:36) 
    at com.cmnatic.mld.Main.GamePanel.init(GamePanel.java:95) 
    at com.cmnatic.mld.Main.GamePanel.run(GamePanel.java:59) 
    at java.lang.Thread.run(Unknown Source) 

」 得到這個輸出現在,我可以給所有的類文件的代碼,一個長長的清單。

(com.cmnatic.mld.GameState.IntroState)在com.cmnatic.mld.GameState.IntroState.init(IntroState.java:31))

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 

import javax.imageio.ImageIO; 

import com.cmnatic.mld.Main.GamePanel; 
import com.cmnatic.mld.Manager.GameStateManager; 
import com.cmnatic.mld.Manager.Keys; 

public class IntroState extends GameState { 

    private BufferedImage logo; 

    private int alpha; 
    private int ticks; 

    private final int FADE_IN = 60; 
    private final int LENGTH = 60; 
    private final int FADE_OUT = 60; 

    public IntroState(GameStateManager gsm) { 
     super(gsm); 
    } 

    public void init() { 
     ticks = 0; 
     try { 
      logo = ImageIO.read(getClass().getResourceAsStream("res/Logo/logo.gif")); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void update() { 
     handleInput(); 
     ticks++; 
     if(ticks < FADE_IN) { 
      alpha = (int) (255 - 255 * (1.0 * ticks/FADE_IN)); 
      if(alpha < 0) alpha = 0; 
     } 
     if(ticks > FADE_IN + LENGTH) { 
      alpha = (int) (255 * (1.0 * ticks - FADE_IN - LENGTH)/FADE_OUT); 
      if(alpha > 255) alpha = 255; 
     } 
     if(ticks > FADE_IN + LENGTH + FADE_OUT) { 
      gsm.setState(GameStateManager.MENU); 
     } 
    } 

    public void draw(Graphics2D g) { 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, GamePanel.WIDTH, GamePanel.HEIGHT2); 
     g.drawImage(logo, 0, 0, GamePanel.WIDTH, GamePanel.HEIGHT2, null); 
     g.setColor(new Color(0, 0, 0, alpha)); 
     g.fillRect(0, 0, GamePanel.WIDTH, GamePanel.HEIGHT2); 
    } 

    public void handleInput() { 
     if(Keys.isPressed(Keys.ENTER)) { 
      gsm.setState(GameStateManager.MENU); 
     } 
    } 

} 

(在com.cmnatic.mld。 Manager.GameStateManager.setState(GameStateManager.java:46) 在com.cmnatic.mld.Manager.GameStateManager。(GameStateManager.java:36)

package com.cmnatic.mld.GameState; 

import java.awt.Graphics2D; 

import com.cmnatic.mld.Manager.GameStateManager; 

import java.awt.Graphics2D; 


public abstract class GameState { 

    protected GameStateManager gsm; 

    public GameState(GameStateManager gsm) { 
     this.gsm = gsm; 
    } 

    public abstract void init(); 
    public abstract void update(); 
    public abstract void draw(Graphics2D g); 
    public abstract void handleInput(); 

} 

在com.cmnatic.mld.Main.GamePanel.init (GamePanel.java:95) at com.cmnatic.mld.Main.GamePanel.run(GamePanel.java:59)

package com.cmnatic.mld.Main; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

import javax.swing.JPanel; 

import com.cmnatic.mld.Manager.GameStateManager; 
import com.cmnatic.mld.Manager.Keys; 

@SuppressWarnings("serial") 
public class GamePanel extends JPanel implements Runnable, KeyListener { 

    // dimensions 
    // HEIGHT is the playing area size 
    // HEIGHT2 includes the bottom window 
    public static final int WIDTH = 128; 
    public static final int HEIGHT = 128; 
    public static final int HEIGHT2 = HEIGHT + 16; 
    public static final int SCALE = 3; 

    // game loop stuff 
    private Thread thread; 
    private boolean running; 
    private final int FPS = 30; 
    private final int TARGET_TIME = 1000/FPS; 

    // drawing stuff 
    private BufferedImage image; 
    private Graphics2D g; 

    // game state manager 
    private GameStateManager gsm; 

    // constructor 
    public GamePanel() { 
     setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT2 * SCALE)); 
     setFocusable(true); 
     requestFocus(); 
    } 

    // ready to display 
    public void addNotify() { 
     super.addNotify(); 
     if(thread == null) { 
      addKeyListener(this); 
      thread = new Thread(this); 
      thread.start(); 
     } 
    } 

    // run new thread 
    public void run() { 

     init(); 

     long start; 
     long elapsed; 
     long wait; 

     // game loop 
     while(running) { 

      start = System.nanoTime(); 

      update(); 
      draw(); 
      drawToScreen(); 

      elapsed = System.nanoTime() - start; 

      wait = TARGET_TIME - elapsed/1000000; 
      if(wait < 0) wait = TARGET_TIME; 

      try { 
       Thread.sleep(wait); 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
      } 

     } 

    } 

    // initializes fields 
    private void init() { 
     running = true; 
     image = new BufferedImage(WIDTH, HEIGHT2, 1); 
     g = (Graphics2D) image.getGraphics(); 
     gsm = new GameStateManager(); 
    } 

    // updates game 
    private void update() { 
     gsm.update(); 
     Keys.update(); 
    } 

    // draws game 
    private void draw() { 
     gsm.draw(g); 
    } 

    // copy buffer to screen 
    private void drawToScreen() { 
     Graphics g2 = getGraphics(); 
     g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT2 * SCALE, null); 
     g2.dispose(); 
    } 

    // key event 
    public void keyTyped(KeyEvent key) {} 
    public void keyPressed(KeyEvent key) { 
     Keys.keySet(key.getKeyCode(), true); 
    } 
    public void keyReleased(KeyEvent key) { 
     Keys.keySet(key.getKeyCode(), false); 
    } 

} 

在java.lang.Thread.run(來源不明)

對不起,真的很長的帖子,但是這是一個的有關該問題的代碼。

我真的累了,所以我會睡幾個小時,回來看看:)

謝謝你們,

回答

2

假設您有以下文件夾結構(使用小寫約定)

project 
    | -- src 
    | -- resources 
    |  | -- logo 
    |    | -- logo.gif 

修改IntroState.init()

try { 
    logo = ImageIO.read(getClass().getResource("/resources/logo/logo.gif")); 
} 

注意0 resources之前的。此代碼完美工作。只用簡單的應用程序進行測試。

+0

嘿,謝謝你的回答。不幸的是,這並不能解決問題。 :< – user3335689

+0

'res'文件夾位於何處?問題似乎是找不到「res/Logo/logo.gif」。 – Trein

+0

Jeah它找不到所有的gif,嘗試包含您的目錄名稱TestGameTable.class.getResource(「/ my/app/res/Logo/logo.gif」); => http://stackoverflow.com/questions/2593154/get-a-resource-using-getresource –

0

問題是getClass().getResourceAsStream("res/Logo/logo.gif")返回null。所以,當你把它作爲的ImageIO.read()第一個參數,它會拋出一個IllegalArgumentException,如ImageIO javadoc說:

拋出:

IllegalArgumentException - if input is null. 

按照Class javadocgetResourceAsStream()回報當它找不到資源時:

返回:

A InputStream object or null if no resource with this name is found 

所以,問題是,res/Logo/logo.gif無法找到。

這裏是你有什麼檢查:

  • 沒有文件存在?
  • 這是正確的路徑嗎?
  • 是否正確?
  • 你在路徑的開始處錯過了一個「/」(因而使它相對而不是絕對)?
0

好吧,3年後,但我得到了同樣的問題,也沒有答案的工作。 所以我試了這個,現在它工作正常(所以如果有人正在尋找這個):

刷新Eclipse包資源管理器中的resouces文件夾!

現在圖像應該顯示在資源管理器中,然後沒有更多的異常。

相關問題