Please help! java.lang.IllegalStateException: SaveGame dataset cannot be created

//save
private void save(){
Node sceneNode = (Node) rootNode.getChild(“scene”);
SaveGame.saveGame(“mycompany/mygame”,
“savegame_001”, sceneNode );
}//sav

help i get the following when saving a game java.lang.IllegalStateException:
SaveGame dataset cannot be created
. please help

Exception information utility breakdown:
“I got an exception”: 1% of the useful information
Exception name: 1% of the useful information
Stack trace: 98% of the useful information

So you have left out 98% of the useful information… might as well have not mentioned the exception at all and said “it doesn’t work”.

1 Like

@pspeed, here is the stack trace:

08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): SEVERE Exception thrown in Thread[GLThread 1624,5,main]
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): java.lang.IllegalStateException: SaveGame dataset cannot be created
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at jme3tools.savegame.SaveGame.saveGame(SaveGame.java:87)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at jme3tools.savegame.SaveGame.saveGame(SaveGame.java:65)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.save(GuiDemo.java:341)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.access$1000012(GuiDemo.java)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000004.execute(GuiDemo.java:306)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000004.execute(GuiDemo.java)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.core.CommandMap.runCommands(CommandMap.java:61)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.Button.runClick(Button.java:333)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.Button$ButtonMouseHandler.mouseButtonEvent(Button.java:410)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.event.MouseEventControl.mouseButtonEvent(MouseEventControl.java:122)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.event.PickEventSession.buttonEvent(PickEventSession.java:624)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.event.TouchAppState.dispatchButton(TouchAppState.java:132)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.simsilica.lemur.event.TouchAppState$TouchObserver.onTouchEvent(TouchAppState.java:201)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.input.InputManager.processQueue(InputManager.java:837)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.input.InputManager.update(InputManager.java:907)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.app.LegacyApplication.update(LegacyApplication.java:725)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:227)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.app.AndroidHarnessFragment.update(AndroidHarnessFragment.java:577)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:336)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18299): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
08-17 04:58:30.894 E/com.jme3.app.AndroidHarnessFragment(18

here is the code of the scene node:

// Create scene…
private void createScene(){

   Node sceneNode = new Node("scene");
   
   // Now create the simple test scene
   for( int i = 0; i < 5; i++ ) {    

       /*
        Box b = new Box(1, 1, 1);
        Geometry geom = new Geometry("Box", b);

        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        */

        
       Box b = new Box(2, 2, 2);
       //Sphere sphereMesh = new Sphere(16, 16, 1);
       Geometry geom = new Geometry("box", b);

       Material newMat = new Material(assetManager,
                                      "Common/MatDefs/Misc/Unshaded.j3md");

       newMat.setTexture("ColorMap", assetManager.
                         loadTexture("Monkey.png"));

       newMat.setColor("Color", ColorRGBA.Green);                


       //Material newMat = new Material(assetManager,
       //           "Common/MatDefs/Light/Lighting.j3md");

       /*
        newMat.setTexture("DiffuseMap",
        assetManager.loadTexture("Monkey.png"));
        newMat.setBoolean("UseMaterialColors", true);
        //newMat.setColor("Diffuse", ColorRGBA.Gray);
        //newMat.setColor("Ambient", ColorRGBA.Gray);
        //alpha test start
        newMat.getAdditionalRenderState().setAlphaTest(true);
        newMat.getAdditionalRenderState().setAlphaFallOff(.5f);

        geom.setQueueBucket(Bucket.Transparent);
        // alpha test end
        */


       geom.setMaterial(newMat);

       geom.setLocalTranslation(-8 + i * 6, 0, -6);

       geom.setUserData("selected", "false");


       MouseEventControl.addListenersToSpatial(geom,
           new DefaultMouseListener() {
               @Override
               protected void click( MouseButtonEvent event, Spatial target, Spatial capture ) {
                   Material m = ((Geometry)target).getMaterial();
                   m.setColor("Color", ColorRGBA.Red);
                   if( event.getButtonIndex() == MouseInput.BUTTON_LEFT ) {
                       target.move(0, 0.1f, 0);
                   } else {
                       target.move(0, -0.1f, 0);
                   }           

                   if( ((String)target.getUserData("selected"))
                      .trim()  == "false"){
                       m.setColor("Color", ColorRGBA.Yellow);
                       target.setUserData("selected", "true");
                       showContextMenu(target);
                   }else{
                       m.setColor("Color", ColorRGBA.Blue);
                       target.setUserData("selected", "false");
                       removeContextMenu();
                   }


               }

               @Override
               public void mouseEntered( MouseMotionEvent event, Spatial target, Spatial capture ) {
                   Material m = ((Geometry)target).getMaterial();
                   //m.setColor("Color", ColorRGBA.Yellow);

               }

               @Override
               public void mouseExited( MouseMotionEvent event, Spatial target, Spatial capture ) {
                   Material m = ((Geometry)target).getMaterial();
                   //m.setColor("Color", ColorRGBA.Blue);
                   
               }                        
           });


       sceneNode.attachChild(geom);

     }//for
   
     rootNode.attachChild(sceneNode);

}//createScene

You probably don’t have the right permission to write to the external storage on android.
You have to set it up in the app manifest
https://developer.android.com/training/basics/data-storage/files.html

EDIT: mhh wait… you are on android right?

3 Likes

@nehon, @pspeed, i have successfully saved the the sceneNode by adding write petmission. my problem now is loading the saved file i got an error:

SEVERE Exception thrown in Thread[GLThread 664,5,main]
java.lang.NullPointerException
at com.jme3.texture.Texture.read(Texture.java:614)
at com.jme3.texture.Texture2D.read(Texture2D.java:215)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.readSavable(BinaryInputCapsule.java:457)
at com.jme3.material.MatParam.read(MatParam.java:368)
at com.jme3.material.MatParamTexture.read(MatParamTexture.java:102)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.resolveIDs(BinaryInputCapsule.java:483)
at com.jme3.export.binary.BinaryInputCapsule.readStringSavableMap(BinaryInputCapsule.java:667)
at com.jme3.material.Material.read(Material.java:1011)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.readSavable(BinaryInputCapsule.java:457)
at com.jme3.scene.Geometry.read(Geometry.java:630)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.resolveIDs(BinaryInputCapsule.java:483)
at com.jme3.export.binary.BinaryInputCapsule.readSavableArray(BinaryInputCapsule.java:471)
at com.jme3.export.binary.BinaryInputCapsule.readSavableArrayList(BinaryInputCapsule.java:587)
at com.jme3.scene.Node.read(Node.java:743)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:242)
at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:125)
at jme3tools.savegame.SaveGame.loadGame(SaveGame.java:184)
at jme3tools.savegame.SaveGame.loadGame(SaveGame.java:128)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.load(GuiDemo.java:347)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.access$1000013(GuiDemo.java)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000005.execute(GuiDemo.java:315)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000005.execute(GuiDemo.java)
at com.simsilica.lemur.core.CommandMap.runCommands(CommandMap.java:61)
at com.simsilica.lemur.Button.runClick(Button.java:333)
at com.simsilica.lemur.Button$ButtonMouseHandler.mouseButtonEvent(Button.java:410)
at com.simsilica.lemur.event.MouseEventControl.mouseButtonEvent(MouseEventControl.java:122)
at com.simsilica.lemur.event.PickEventSession.buttonEvent(PickEventSession.java:624)
at com.simsilica.lemur.event.TouchAppState.dispatchButton(TouchAppState.java:132)
at com.simsilica.lemur.event.TouchAppState$TouchObserver.onTouchEvent(TouchAppState.java:201)
at com.jme3.input.InputManager.processQueue(InputManager.java:837)
at com.jme3.input.InputManager.update(InputManager.java:907)
at com.jme3.app.LegacyApplication.update(LegacyApplication.java:725)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:227)
at com.jme3.app.AndroidHarnessFragment.update(AndroidHarnessFragment.java:577)
at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:336)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

the foplowing are the save and load codes

//save
private void save(){
Node sceneNode = (Node) rootNode.getChild(“scene”);
SaveGame.saveGame(“mycompany/mygame”,
“savegame_001”, sceneNode );
}//save

//load
private void load(){
    Node sceneNode =  (Node) SaveGame.
                loadGame("mycompany/mygame", "savegame_001" );
    rootNode.attachChild(sceneNode);
}//load

Why are you saving the entire root node? SaveGame is not meant for that.
You have to create a Savable object that contains the relevant information needed to rebuild your game in the same state…

@nehon, it’s not a rootnode but just a scene node .

i just wanted to create a simple 3d modeller for engineering not a game. so i think i just have to save and load a scene with objects. all i want now is to reload the sceneNode i saved. @nehon, @pspeed

Please stop pinging me in every one of your post, I read the forum, I’ll see your post.
The problem here is that you have external assets.
What you could try is remove the textureKey on every texture, so that they are embed in the save file.
that’s basically go over all your materials, find all textures and do : texture.setTextureKey(null).

1 Like

by texture.setKey(null) , the exception dissappeared. however, i encounter a new exception:

java.lang.NullPointerException

at com.jme3.material.Material.read(Material.java:1050)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.readSavable(BinaryInputCapsule.java:457)
at com.jme3.scene.Geometry.read(Geometry.java:630)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryInputCapsule.resolveIDs(BinaryInputCapsule.java:483)
at com.jme3.export.binary.BinaryInputCapsule.readSavableArray(BinaryInputCapsule.java:471)
at com.jme3.export.binary.BinaryInputCapsule.readSavableArrayList(BinaryInputCapsule.java:587)
at com.jme3.scene.Node.read(Node.java:743)
at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:242)
at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:125)
at jme3tools.savegame.SaveGame.loadGame(SaveGame.java:184)
at jme3tools.savegame.SaveGame.loadGame(SaveGame.java:128)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.load(GuiDemo.java:308)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo.access$1000013(GuiDemo.java)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000005.execute(GuiDemo.java:276)
at org.jmonkeyengine.simple_jme_android.mylemurapp.GuiDemo$100000005.execute(GuiDemo.java)
at com.simsilica.lemur.core.CommandMap.runCommands(CommandMap.java:61)
at com.simsilica.lemur.Button.runClick(Button.java:333)
at com.simsilica.lemur.Button$ButtonMouseHandler.mouseButtonEvent(Button.java:410)
at com.simsilica.lemur.event.MouseEventControl.mouseButtonEvent(MouseEventControl.java:122)
at com.simsilica.lemur.event.PickEventSession.buttonEvent(PickEventSession.java:624)
at com.simsilica.lemur.event.TouchAppState.dispatchButton(TouchAppState.java:132)
at com.simsilica.lemur.event.TouchAppState$TouchObserver.onTouchEvent(TouchAppState.java:201)
at com.jme3.input.InputManager.processQueue(InputManager.java:837)
at com.jme3.input.InputManager.update(InputManager.java:907)
at com.jme3.app.LegacyApplication.update(LegacyApplication.java:725)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:227)
at com.jme3.app.AndroidHarnessFragment.update(AndroidHarnessFragment.java:577)
at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:336)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

k

by texture.setKey(null) , the exception dissappeared. however, i encounter a new bug