2012-05-12 4 views
0

Я пытаюсь использовать сканер для редактирования уровня моей игры защиты башни. Однако он не будет обновлять уровень (изображения плитки) до уровня пользовательского файла (0 - трава 1 - камень -1 - ничто и т. Д.). Я нашел ошибку, но как ее исправить, что мне нужно добавить/изменить, чтобы избавиться от этого? Я решил первую ошибку, но теперь я получаю это:NullPointerException in j.u.Scanner use

java.lang.NullPointerException 
    at Levels.loadLevels(Levels.java:13) 
    at Window.define(Window.java:28) 
    at Window.paintComponent(Window.java:44) 

линии 13: Window.room.block[y][x].groundID = loadLevelsScanner.nextInt(); линии 28: levels.loadLevels(new File("levels/level1.level")); линии 44: define();

Это файл сканера:

import java.io.*; 
import java.util.*; 

public class Levels { 
    public void loadLevels(File loadPath) { 
     try { 
      Scanner loadLevelsScanner = new Scanner(loadPath); 

      while(loadLevelsScanner.hasNext()) { 

       for(int y=0;y<Window.room.block.length;y++) { 
        for(int x=0;x<Window.room.block[0].length;x++) { 
         Window.room.block[y][x].groundID = loadLevelsScanner.nextInt(); 
        } 
       } 

       for(int y=0;y<Window.room.block.length;y++) { 
        for(int x=0;x<Window.room.block[0].length;x++) { 
         Window.room.block[y][x].airID = loadLevelsScanner.nextInt(); 
        } 
       } 

      } 

      loadLevelsScanner.close(); 

     } catch(Exception e) { 

     } 
    } 
} 

это является файл окна:

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 

public class Window extends JPanel implements Runnable { 

    public Thread thread = new Thread(this); 

    public static Image[] tileset_ground = new Image[100]; 
    public static Image[] tileset_air = new Image[100]; 

    public static int myWidth, myHeight; 

    public static boolean isFirst = true; 

    public static Room room; 
    public static Levels levels; 

    public Window() { 
     thread.start(); 
    } 

    public void define() { 
     room = new Room(); 
     levels = new Levels(); 

     levels.loadLevels(new File("levels/level1.level")); 

     for(int i=0;i<tileset_ground.length; i++) { 
      tileset_ground[i] = new ImageIcon("resources/tileset_ground.png").getImage(); 
      tileset_ground[i] = createImage(new FilteredImageSource(tileset_ground[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     } 

     for(int i=0;i<tileset_air.length; i++) { 
      tileset_air[i] = new ImageIcon("resources/tileset_air.png").getImage(); 
      tileset_air[i] = createImage(new FilteredImageSource(tileset_air[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     } 

    } 

    public void paintComponent(Graphics g) { 
     if(isFirst) { 
      define(); 

      isFirst = false; 
     } 

     g.clearRect(0, 0, getWidth(), getHeight()); 

     room.draw(g); 
    } 

    public void run() { 
     while(true) { 

      if(!isFirst) { 
       room.physic(); 
      } 

      repaint(); 

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

      } 

     } 

    } 

} 

Это файл номер:

import java.awt.*; 

public class Room { 
    public int worldWidth = 40; 
    public int worldHeight = 20; 
    public int blockSize = 32; 

    public Block[][] block; 

    public Room() { 
     block = new Block[worldHeight][worldWidth]; 
    } 

    public void define() { 

    } 


    public void physic() { 

    } 

    public void draw(Graphics g) { 

     for(int y=0;y<block.length;y++) { 
      for(int x=0;x<block[0].length;x++) { 
       block[y][x] = new Block(x * blockSize, y * blockSize, blockSize, blockSize, Value.groundGrass, Value.airAir); 
       block[y][x].draw(g); 
      } 
     } 
    } 

} 

это блок файла:

import java.awt.*; 

public class Block extends Rectangle { 
    public int groundID; 
    public int airID; 

    public Block(int x, int y, int width, int height, int groundID, int airID) { 
     setBounds(x, y, width, height); 

     this.groundID = groundID; 
     this.airID = airID; 
    } 

    public void draw(Graphics g) { 
     g.drawImage(Window.tileset_ground[groundID], x, y, width, height, null); 

     if(airID != Value.airAir) { 
      g.drawImage(Window.tileset_air[airID], x, y, width, height, null); 
     } 

    } 

} 

И, наконец, это пользовательский файл сканер должен прочитать:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
+0

Я закрыл этот, потому что он был не о оригинальной проблеме больше – core16

+0

Это точно такая же проблема. Вы просто скопировали весь контент, кроме заголовка. –

+0

Я не отозвал его – core16

ответ

2

Читать сообщение об ошибке:

java.lang.NullPointerException 
    at Levels.loadLevels(Levels.java:11) 

Line 11 из Levels.java является

for(int y=0;y<Window.room.block.length;y++) { 

Итак, либо Window.room имеет нулевое значение, или Window.room.block равно нулю.

+0

Window.room.block имеет значение null, но я не знаю, как его исправить. – core16

+0

Инициализируйте его в конструкторе, а не инициализируйте его (снова и снова и снова) в методе 'draw()' , –

+0

как бы я это сделал? – core16

2

Вы не экземпляр Room, эта часть вызывает NPE: Window.room. Две вещи, чтобы быть в курсе:

  1. Это плохая идея, чтобы все ваши атрибуты, как static членов
  2. Вы должны инстанцировать все (static или экземпляр) атрибуты где-то перед тем первое использование

В вашем коде вы должны убедиться, что метод define() в Window вызывается до метода loadLevels() в Levels.

+0

@ user1361852 Я отредактировал свой ответ –

+0

как мне это сделать, хотя я новичок в java? – core16