Java JSON和Eclipse—为什么会引发异常?

Java JSON和Eclipse—为什么会引发异常?,java,json,eclipse,lwjgl,slick,Java,Json,Eclipse,Lwjgl,Slick,我对java有相当多的了解,但对Slick2d和JSON还不熟悉。我无法理解在尝试加载.json映射文件时引发异常的原因。我正在使用eclipse、slick2d、lwjgl和json。我构建了一个映射文件,它位于eclipse中的res/maps下/ 这是堆栈跟踪 java.lang.ClassCastException: java.lang.String cannot be cast to org.json.simple.JSONArray at cardboard.world.World.

我对java有相当多的了解,但对Slick2d和JSON还不熟悉。我无法理解在尝试加载.json映射文件时引发异常的原因。我正在使用eclipse、slick2d、lwjgl和json。我构建了一个映射文件,它位于eclipse中的res/maps下/ 这是堆栈跟踪

java.lang.ClassCastException: java.lang.String cannot be cast to org.json.simple.JSONArray
at cardboard.world.World.load(World.java:33)
at cardboard.Engine.initStatesList(Engine.java:49)
at org.newdawn.slick.state.StateBasedGame.init(StateBasedGame.java:164)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:393)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:317)
at cardboard.Engine.main(Engine.java:31)
下面是正在执行的代码

try {
        World.load("res/maps/world.json");
    } catch (Exception e) {
        System.err.println("Map does not exist");
        System.exit(0);
    }
这是世界级的

import java.io.FileReader;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.newdawn.slick.Image;
import org.newdawn.slick.SpriteSheet;

import cardboard.Resources;

public class World {

public static Image[][] solids;
public static int WIDTH;
public static int HEIGHT;

public static void load(String path) throws Exception {

    JSONParser parser = new JSONParser();
    Object obj = parser.parse(new FileReader(path));
    JSONObject jObj = (JSONObject) obj;

    JSONArray layers = (JSONArray) jObj.get("layers");
    int amount = layers.size();

    for (int i = 0; i < amount; i++) {
        JSONObject layer = (JSONObject) layers.get(i);
        String type = (String) layer.get("name");

        if (type.equals("solids")) {
            solids = parse((JSONArray)layer.get("data"));
        } else if (type.equals("spawns")) {
            // Spawn point code
        }
    }

}

private static Image[][] parse(JSONArray arr) {

    Image[][] layer = new Image [WIDTH][HEIGHT];
    int index;

    for (int y = 0; y < WIDTH; y++) {
        for (int x = 0; x < HEIGHT; x++) {
            index = (int)((long)arr.get((y * WIDTH) + x));
            layer[x][y] = getSpriteImage(index);
        }
    }

    return layer;
}

private static Image getSpriteImage(int index) {
    if (index == 0) return null;
    index -= 1;

    SpriteSheet sheet = Resources.getSprite("tileset");
    //int vertical = sheet.getVerticalCount();
    int horizontal = sheet.getHorizontalCount();

    int y = (index / horizontal); //vert?
    int x = (index % horizontal);

    return sheet.getSubImage(x, y);
}
}
导入java.io.FileReader;
导入org.json.simple.JSONArray;
导入org.json.simple.JSONObject;
导入org.json.simple.parser.JSONParser;
导入org.newdawn.slick.Image;
导入org.newdawn.slick.SpriteSheet;
进口纸板。资源;
公共阶级世界{
公共静态图像[][]实体;
公共静态整数宽度;
公共静态内部高度;
公共静态无效加载(字符串路径)引发异常{
JSONParser=新的JSONParser();
objectobj=parser.parse(新文件读取器(路径));
JSONObject jObj=(JSONObject)obj;
JSONArray层=(JSONArray)jObj.get(“层”);
int amount=layers.size();
对于(int i=0;i
Eclipse没有抛出错误,我只是收到了我写的错误消息“Map不存在”,如果你能看一下,那将是超级棒!谢谢

如果您需要Resources.java

package cardboard;

import java.util.HashMap;
import java.util.Map;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.SpriteSheet;

import cardboard.world.Tile;

public class Resources {

private static Map<String, Image> images;
private static Map<String, SpriteSheet> sprites;
private static Map<String, Sound> sounds;

public Resources() {

    images = new HashMap<String, Image>();
    sprites = new HashMap<String, SpriteSheet>();
    sounds = new HashMap<String, Sound>();

    try {
        sprites.put("tileset", loadSprite("res/tileset.png",  Tile.SMALL_SIZE, Tile.SMALL_SIZE));
    } catch (SlickException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static Image loadImage(String path) throws SlickException {
    return new Image(path, false, Image.FILTER_NEAREST);
}

public static SpriteSheet loadSprite(String path, int tw, int th) throws    SlickException {
    return new SpriteSheet(loadImage(path), tw, th);
}

public static SpriteSheet getSprite(String getter) {
    return sprites.get(getter);
}

public static Image getSpriteImage(String getter, int x, int y) {
    return sprites.get(getter).getSubImage(x,y);
}

public static Image image(String getter) {
    return sprites.get(getter);
}

public static Image getImage(String getter) {
    return images.get(getter);
}

public static Sound getSound(String getter) {
    return sounds.get(getter);
}
}
包装纸板;
导入java.util.HashMap;
导入java.util.Map;
导入org.newdawn.slick.Image;
导入org.newdawn.slick.SlickException;
导入org.newdawn.slick.Sound;
导入org.newdawn.slick.SpriteSheet;
进口纸板.世界.瓷砖;
公共类资源{
私有静态地图图像;
私有静态映射精灵;
私有静态地图声音;
公共资源(){
images=newhashmap();
sprites=newhashmap();
sounds=新HashMap();
试一试{
sprites.put(“tileset”,loadSprite(“res/tileset.png”,Tile.SMALL_SIZE,Tile.SMALL_SIZE));
}接住(滑溜){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态映像loadImage(字符串路径)引发异常{
返回新图像(路径、错误、图像.过滤器\u最近);
}
公共静态SpriteSheet loadSprite(字符串路径,int-tw,int-th)引发异常{
返回新的SpriteSheet(loadImage(路径),tw,th);
}
公共静态SpriteSheet getSprite(字符串getter){
返回精灵。获取(getter);
}
公共静态图像getSpriteImage(字符串getter,int x,int y){
返回sprites.get(getter.getSubImage(x,y);
}
公共静态映像(字符串getter){
返回精灵。获取(getter);
}
公共静态映像getImage(字符串getter){
返回图像。获取(getter);
}
公共静态声音getSound(字符串getter){
返回声音。获取(getter);
}
}

java
中引入了两种异常

A)选中异常(编译时):在编译时处理异常,只是为了检测任何外部组件或资源依赖关系(如
FileNotFound
IOException

B)未经检查的异常(运行时异常):此异常出现时,由于任何意外情况而导致任何逻辑错误或任何错误。(
IndexOutOfBound
NullPointer
等)

现在你的问题

为什么在尝试加载.json映射文件时引发异常

如果您试图加载程序中的任何文件
.json
,该文件是从任何存储区域(磁盘、云等)加载的外部资源。因此,存储区域可能不存在
文件

因此,为了处理这种不确定的情况,您的程序应该准备好处理这种情况(这不是一个逻辑错误,而是对其他资源的依赖,这些资源是代码的间接部分)


这就是将此类内容放在
检查异常
段中的原因。

当您捕获异常
e
时,您应该对该
e
进行处理。要获取有关引发异常的位置的更多信息,请使用以下代码:

} catch (Exception e) {
  e.printStackTrace();
  System.exit(1); // Because 1 means failure, 0 means OK.
}

你有什么例外?用
System.out.println
打印,例如只需打印例外项,请在问题中添加打印堆栈@squirt706谢谢您知道相当多的Java,但是您不知道使用
e.printStackTrace()显示异常stacktrace的绝对基础知识
?@Enigo您不使用
System.out.println
显示异常。使用它来显示
NullPointerException
将显示
null
,这与他当前的异常“处理”一样有用。谢谢,所以我更新了我的帖子。我查阅了如何读取堆栈跟踪(从下到上),但无法取得任何进展:33是solids=parse((JSONArray)layer.get(“data”);例外情况非常明显。JSON解析器将
数据
字段解释为一个字符串(因为JSON数据看起来像它),但是您强制Java将其解释为JSONArray。看看JSON数据以及如何使用它