Member 13946476 Ответов: 1

Мой код выдает это исключение, и я не знаю, как его исправить


import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import java.util.ArrayList;
import java.util.Random;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;

public class game extends Canvas implements Runnable,KeyListener {
	
	public static final int WIDTH=640,HEIGHT=480;
	
	boolean running=false;
	
	private Thread thread;
	
	public Room room;
	
	public Bird bird;
	
public game() {
	Dimension d=new Dimension(game.WIDTH,game.HEIGHT);
	setPreferredSize(d);
	addKeyListener(this);
	setFocusable(true);
	setFocusTraversalKeysEnabled(false);
	room=new Room(80);
	bird=new Bird(20,game.HEIGHT/2,room.tubes);
}
public synchronized void start() {
	if(running) return;
	running = true;
	thread = new Thread(this);
	thread.start();
}
public synchronized void stop() {
	if(!running) return;
	running =false;
	try {
		thread.join();
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}
	public static void main(String[] args) {
		JFrame frame=new JFrame("flappy bird");
		game Game = new game();
		frame.add(Game);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
        Game.start();
	}

	@Override
	public void run() {
		int fps=0;
		long LastTime=System.nanoTime();
		double Timer=System.currentTimeMillis();
		double ns=1000000000/60;
		double delta=0;
		while(running) {
			long now=System.nanoTime();
			delta+= (now -LastTime) / ns;
			LastTime=now;
			while(delta >= 1) {
				update();
				render();
				fps++;
				delta--;
			}
			if(System.currentTimeMillis() - Timer>=1000) {
				System.out.println("FPS: "+fps);
				fps=0;
				Timer+=1000;
				
			}
		}
		stop();
	}
	private void render() {
		BufferStrategy bf=getBufferStrategy();
		if(bf==null) {
			createBufferStrategy(3);
			return;
		}
		Graphics g=bf.getDrawGraphics();
		g.setColor(Color.CYAN.darker().darker());
		g.fillRect(0, 0, game.WIDTH, game.HEIGHT);
		room.render(g);
		bird.render(g);
		g.dispose();
		bf.show();
		
	}
	private void update() {
		room.update();
		bird.update();
	}
	@Override
	public void keyPressed(KeyEvent e) {
		int c=e.getKeyCode();
		if(c==KeyEvent.VK_SPACE) {
			bird.isPressed=true;
		}
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
	
			bird.isPressed=false;
	}
	@Override
	public void keyTyped(KeyEvent arg0) {}

}
public class Room {
	public ArrayList<Rectangle> tubes;
	private int time=0;
	private int currentTime=0;
	private int spd=3;
	private final int SPACE_TUBE=95;
	private final int WIDTH_TUBES=40 ;
	Random rand;
	public Room(int time) {
		tubes=new ArrayList<>();
		this.time=time;
		rand=new Random();
	}
public void update() {
	currentTime++;
	if(currentTime==time) {
		currentTime=0;
	
	int height1=rand.nextInt(game.HEIGHT/2);
	int y2=height1+SPACE_TUBE;
	int height2=game.HEIGHT-y2;
	
	tubes.add(new Rectangle(game.WIDTH,0,WIDTH_TUBES,height1));
	tubes.add(new Rectangle(game.WIDTH,y2,WIDTH_TUBES,height2));
	}
	for(int i=0;i<tubes.size();i++) {
		Rectangle rect=tubes.get(i);
		rect.x-=spd;
		if(rect.width+rect.x<=0) {
			tubes.remove(i--);
			continue;
		}
	}
	}
public void render(Graphics g) {
	g.setColor(new Color(43, 216, 57));
	for(int i=0;i<tubes.size();i++) {
		Rectangle rect=tubes.get(i);
		g.fillRect(rect.x, rect.y,rect.width, rect.height);
	}
}
}
public class Bird extends Rectangle {
	private int spd=3;
	public boolean isPressed=false;
	private BufferedImage sheet;
	private BufferedImage[] texture;
	private ArrayList<Rectangle> tubes;
	public Bird(int x,int y,ArrayList<Rectangle> tubes) {
	setBounds(x,y,32,32);
	this.tubes=tubes;
	texture = new BufferedImage[3];
	try {
//the problem is here
		sheet= ImageIO.read(getClass().getResourceAsStream("/Untitled.png"));
		texture[0]=sheet.getSubimage(0, 0, 16, 16);
		texture[1]=sheet.getSubimage(16, 0, 16, 16);
		texture[2]=sheet.getSubimage(32, 0, 16, 16);
	} catch (IOException e) {
		e.printStackTrace();
	}
}
public void update() {
	if(isPressed) {
		y-=spd;
	}
	else {
		y+=spd;
	}
	for(int i=0;i<tubes.size();i++) {
		if(this.intersects(tubes.get(i))){
			JOptionPane.showMessageDialog(null, "You loose");
			System.exit(1);
		}
	}
}
public void render(Graphics g) {
g.drawImage(texture[0],x,y,null);
}
}




вот полный код игры, которую я пытаюсь создать, и у меня есть это исключение:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
	at java.desktop/javax.imageio.ImageIO.read(Unknown Source)

игра представляет собой простую игру flappy bird и она не работает из-за этого исключения, когда я пытаюсь импортировать лист спрайта для птицы, и он находится в папке, которую я создал в рабочей области, как сказано в учебнике, который я смотрел, так что вы можете guyz plz помочь и сказать мне, как исправить эту проблему

Что я уже пробовал:

я действительно пытался использовать другие методы для импорта этого изображения, но все они давали одно и то же исключение
пожалуйста помогите guyz мне нужна ваша помощь в моей первой игре

1 Ответов

Рейтинг:
6

OriginalGriff

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

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!