LibGDX Othographic Camera Problem

So I keep getting a null pointer exception and i have no clue why. For some reason cam is null, but i initialize it the same way i do ScaledCam and it works fine. I think something is messed up from the the path it takes from the Main class to Play class, but i cant find it

this is the Main class were i initialize the cam

public class Main extends ApplicationAdapter {
	public static final String Title = "Mead Walla";
	public static final int Width = 360;
	public static final int Height = 240;
	public static final int Scale = 2;

	private SpriteBatch sb;
	private OrthographicCamera cam;
	private OrthographicCamera hudCam;

	private GameStateHandler gsh;
	
	public static ContentHandler res;

	public void create() {
		//initialize handlers
		res = new ContentHandler();
		gsh = new GameStateHandler(this);
		
		//load content
		try {
			res.loadTexture("player/testPlayer.png", "testPlayer");
		}
		catch(Exception e) {
			System.out.println("Cannot find file: testPlayer");
			Gdx.app.exit();
		}
		
		//initialize LibGDX elements
		sb = new SpriteBatch();
		cam = new OrthographicCamera();
		cam.setToOrtho(false, Width, Height);
		hudCam = new OrthographicCamera();
		hudCam.setToOrtho(false, Width, Height);
		Gdx.input.setInputProcessor(new InputHandler());
	}

	public void render() {
		Gdx.graphics.setTitle(Title + " -- FPS: " + Gdx.graphics.getFramesPerSecond());
		gsh.update(Gdx.graphics.getDeltaTime());
		gsh.render();
		InputHandler.update();
		
		sb.setProjectionMatrix(hudCam.combined);
		sb.begin();
		sb.draw(res.getTexture("testPlayer"), 0, 0);
		sb.end();
	}

	public SpriteBatch getSpriteBatch() {
		return sb;
	}

	public OrthographicCamera getCam() {
		return cam;
	}

	public OrthographicCamera getHudCam() {
		return hudCam;
	}

the state class should get the cam from main and set it to the cam in state

public abstract class State {
	protected GameStateHandler gsh;
	protected Main game;

	protected SpriteBatch sb;
	protected OrthographicCamera cam;
	protected OrthographicCamera hudCam;

	protected State(GameStateHandler gsh) {
		this.gsh = gsh;
		game = gsh.getGame();
		sb = game.getSpriteBatch();
		cam = game.getCam();
		hudCam = game.getHudCam();
	}

	public abstract void handleInput();
	public abstract void update(float dt);
	public abstract void render();
	public abstract void dispose();
}

this is the play class were i try to use the cam to render the TileMap but when i get to setView(cam) its null, if i use ScaledCam it runs its just not the right view

public class Play extends State {
	//Box2D elements
	private World world;
	private BodyDef bdef;
	private Body body;
	private Body boxBody;
	private FixtureDef fdef;
	private PolygonShape shape;
	private Box2DDebugRenderer b2dr;
	private OrthographicCamera ScaledCam;
	private TiledMap tileMap;
	private OrthogonalTiledMapRenderer tmr;

	//Box2D variables
	private static float ppm = B2D.PPM;
	private static float gravityX = 0;
	private static float gravityY = -9.81f;

	public Play(GameStateHandler gsh) {
		super(gsh);
		//initialize elements
		world = new World(new Vector2(gravityX, gravityY), true);
		bdef = new BodyDef();
		fdef = new FixtureDef();
		shape = new PolygonShape();
		b2dr = new Box2DDebugRenderer();
		ScaledCam = new OrthographicCamera();
		ScaledCam.setToOrtho(false, Main.Width / ppm, Main.Height / ppm);
		world.setContactListener(new ContactHandler());

		//test platform body definition
		bdef.position.set(160 / ppm, 120 / ppm);
		bdef.type = BodyType.StaticBody;
		body = world.createBody(bdef);

		//test platform fixture definition
		shape.setAsBox(50 / ppm, 5 / ppm);
		fdef.shape = shape;
		fdef.filter.categoryBits = B2D.Bit_One;
		fdef.filter.maskBits = B2D.Bit_Two;
		body.createFixture(fdef).setUserData("platform");

		//test box body definition
		bdef.position.set(160 / ppm, 200 / ppm);
		bdef.type = BodyType.DynamicBody;
		boxBody = world.createBody(bdef);

		//test box fixture definition
		shape.setAsBox(5 / ppm, 5 / ppm);
		fdef.shape = shape;
		fdef.filter.categoryBits = B2D.Bit_Two;
		fdef.filter.maskBits = B2D.Bit_One;
		boxBody.createFixture(fdef).setUserData("box");
		
		//test box sensor
		shape.setAsBox(2 / ppm, 2 / ppm, new Vector2(0, -5 / ppm), 0);
		//set to same stuff between shape and create in player
		fdef.isSensor = true;
		boxBody.createFixture(fdef).setUserData("sensor");
		
		//load tile map
		try {
			tileMap = new TmxMapLoader().load("map/test.tmx");
		}
		catch(Exception e) {
			System.out.println("Cannot find file: map/test.tmx");
			Gdx.app.exit();
		}
		tmr = new OrthogonalTiledMapRenderer(tileMap);
	}

	public void update(float dt) {
		handleInput();
		world.step(dt, 6, 2);
	}

	public void render() {
		//clear screen
		Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);

		//draw tile map
		tmr.setView(cam);
		tmr.render();

		//draw box2d world
		b2dr.render(world, ScaledCam.combined);
	}

	public void handleInput() {}

	public void dispose() {}
}

I can not find why its null. any help would be appreciated.

From what I can see, you initialize the cam in your Main class AFTER initializing the GameStateHandler. If the GameStateHandler creates and intializes the Play state, then your call to getCam() would return null because the Main class had not initialized the camera yet! Your posted code doesn’t show where and when the Play state is set up but I’m betting that’s it.