I'm making a flashlight app using SurfaceView.  My code does not produce an error, but stops when I run it. I don't know why it stops. 
Here's the full code:
MainActivity.java
package com.example.flashlight;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Toast;
import android.widget.ToggleButton;
public class MainActivity extends Activity implements SurfaceHolder.Callback {
private final static String TAG = "Flashlight Test";
Camera cam;
ToggleButton togglebtn;
Parameters p;
private SurfaceView surface;
private SurfaceHolder surfaceholder;
private boolean hasFlash;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    // if Device doesn't support flashlight
    if (!hasFlash) {
        AlertDialog.Builder noflash = new AlertDialog.Builder(this);
        noflash.setTitle(getString(R.string.errord_title));
        noflash.setMessage(getString(R.string.errord_content));
        noflash.setPositiveButton(getString(R.string.errord_posbutton), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
                finish();
            }
        });
        noflash.show();
    }
    togglebtn = (ToggleButton)findViewById(R.id.togglebtn_switch);
    togglebtn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            try {
                if (cam == null) {
                    cam = Camera.open();
                }
                p = cam.getParameters();
                List<String> flashModes = p.getSupportedFlashModes();
                if (isChecked) {
                    if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
                        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    } else {
                    }
                    p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                } else {
                p.setFlashMode(Parameters.FLASH_MODE_OFF);
            }
            cam.setParameters(p);
            cam.startPreview();
        } catch (Exception e) {
            Log.d(TAG, "Exception" + e);
            Toast.makeText(MainActivity.this, "Flashlight: Exception", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
            if (cam != null) {
                cam.stopPreview();
                cam.release();
            }
        }
    }
    });
    surface = (SurfaceView) this.findViewById(R.id.surface);
    surfaceholder = surface.getHolder();
    surfaceholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceholder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        cam.setPreviewDisplay(holder);
    } catch (IOException e) {
        Log.e(TAG, "IOException setPreviewDisplay()", e);
    }
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
Here's Logcat (e)
03-21 01:09:24.861: E/AndroidRuntime(17649): FATAL EXCEPTION: main
03-21 01:09:24.861: E/AndroidRuntime(17649): Process: com.example.flashlight, PID: 17649
03-21 01:09:24.861: E/AndroidRuntime(17649): java.lang.NullPointerException
03-21 01:09:24.861: E/AndroidRuntime(17649):    at com.example.flashlight.MainActivity.surfaceCreated(MainActivity.java:102)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.SurfaceView.updateWindow(SurfaceView.java:601)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.SurfaceView.access$000(SurfaceView.java:94)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:879)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2131)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1234)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6469)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.Choreographer.doCallbacks(Choreographer.java:603)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.Choreographer.doFrame(Choreographer.java:573)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.os.Handler.handleCallback(Handler.java:733)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.os.Handler.dispatchMessage(Handler.java:95)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.os.Looper.loop(Looper.java:157)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at android.app.ActivityThread.main(ActivityThread.java:5356)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at java.lang.reflect.Method.invokeNative(Native Method)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at java.lang.reflect.Method.invoke(Method.java:515)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
03-21 01:09:24.861: E/AndroidRuntime(17649):    at dalvik.system.NativeStart.main(Native Method)
How can I solve this problem? Please help. :(
 
    