簡體   English   中英

java.lang.IllegalArgumentException:input == null

[英]java.lang.IllegalArgumentException: input == null

我正在參加這個Mini Ludum Dare#49

我已經完成了我的代碼,但是在運行和編譯時我遇到了一個問題(很多)。

我在控制台中獲得此輸出“

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)at 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.mld.Manager.GameStateManager的com.cmnatic.mld.Manager.GameStateManager.setState(GameStateManager.java:46)。(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();

}

at 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(未知來源)

很抱歉很長的帖子,但這是與問題相關的代碼。

我真的很累,所以我會睡幾個小時然后再回來:)

多謝你們,

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

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

修改你的IntroState.init()

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

注意/之前的resources 這段代碼完美無缺。 剛剛用一個簡單的應用程序測試

問題是getClass().getResourceAsStream("res/Logo/logo.gif")返回null 因此,當您將其作為ImageIO.read()的第一個參數傳遞時,它將拋出IllegalArgumentException ,如ImageIO javadoc中所述:

拋出:

 IllegalArgumentException - if input is null. 

根據Class javadocgetResourceAsStream()在找不到ressource時返回null

返回:

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

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

以下是您必須檢查的內容:

  • 文件存在嗎?
  • 這是正確的道路嗎?
  • 情況是否正確?
  • 你錯過了路徑開頭的“/”(從而使它相對而不是絕對)?

好的,3年到晚了,但我遇到了同樣的問題,也沒有一個答案奏效。 所以我嘗試了這個,現在它工作正常(所以如果有人在搜索這個):

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

現在,圖像應該顯示在資源管理器中,然后就不會有例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM