开发者

Null pointer exeception thrown while accesing the graphical layout

Code :-

public class DigitalDial extends View{
    private Paint titlePaint;
    private String title;
    private Float value ;

    public DigitalDial(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public DigitalDial(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DigitalDial(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setValue(float value) {
        this.value = value;
        invalidate();   
    }

@Override 
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // draw some text using FILL style
        titlePaint = new Paint();
        titlePaint.setStyle(Paint.Style.FILL);
        titlePaint.setTypeface(Typeface.DEFAULT_BOLD);
        //paint.setTextAlign(Paint.Align.RIGHT);
        titlePaint.setColor(Color.YELLOW);
        titlePaint.setAntiAlias(true);
        titlePaint.setTextSize(28);
        drawTitle(canvas);

    }   

    public void setTitle(String title) {
        this.title = title;
    }

    private String getTitle() {
        return title;
    }

    public void drawTitle(Canvas canvas) {
        String title = getTitle();
        canvas.drawText(title,30, 48, titlePaint);              
    }
}

Error while accessing graphical layout :- java.lang.NullPointerException

Error shown while debugging : titlePaint is null but why ????

Help appreciated .

Sorry for incomplete code . Missing code snippet ;-

    package pkg.digitalDial;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.CountDownTimer;

    import pkg.digitalDial.DigitalDial;

    public class DigitalDialActivity extends Activity {
           /** Called when the activity is first created. */
        DigitalDial speedDial ;
        CountDownTimer speedTimer;

            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.digitaldial);          
                speedDial = (DigitalDial) findViewById(R.id.dial1);

                speedDial.setTitle("Speed");
                speedDial.setValue(2.0f);
            }            
    }

Error Log :-

java.lang.NullPointerException
    at android.graphics.Canvas_Delegate.drawText(Canvas_Delegate.java:276)
    at android.graphics.Canvas.drawText(Canvas.java)
    at pkg.digitalDial.DigitalDial.drawTitle(DigitalDial.java:62)
    at pkg.digitalDial.DigitalDial.onDraw(DigitalDial.java:48)
    at android.view.View.draw(View.java:6740)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
    at android.view.View.draw(View.java:6743)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
    at android.view.View.draw(View.java:6743)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:466)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:320)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:325)
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService.createRenderSession(RenderService.java:380)
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1310)
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1075)
    at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:901)
    at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.pageChange(LayoutEditor.java:403)
    at org.eclipse.ui.part.MultiPageEditorPart.setActivePage(MultiPageEditorPart.java:1076)
    at org.eclipse.ui.forms.editor.FormEditor.setActivePage(FormEditor.java:601)
    at com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.selectDefaultPage(AndroidXmlEditor.java:314)
    at com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor.addPages(AndroidXmlEditor.java:219)
    at org.eclipse.ui.forms.editor.FormEditor.createPages(FormEditor.java:138)
    at org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:357)
    at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:662)
    at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:462)
    at org.eclipse.ui.in开发者_运维问答ternal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
    at org.eclipse.ui.internal.EditorReference.getEditor(EditorReference.java:286)
    at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2857)
    at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2762)
    at org.eclipse.ui.internal.WorkbenchPage.access$11(WorkbenchPage.java:2754)
    at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:2705)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2701)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2685)
    at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2676)
    at org.eclipse.ui.ide.IDE.openEditor(IDE.java:651)
    at org.eclipse.ui.ide.IDE.openEditor(IDE.java:610)
    at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:361)
    at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:168)
    at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:229)
    at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:208)
    at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:274)
    at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:250)
    at org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionGroup.handleOpen(PackageExplorerActionGroup.java:373)
    at org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart$4.open(PackageExplorerPart.java:526)
    at org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:48)
    at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:842)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.runtime.Platform.run(Platform.java:888)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:840)
    at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1101)
    at org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:1205)
    at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:264)
    at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:258)
    at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:298)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1311)


When you ask for help about an exception, it's always a good idea to post the full stack trace. That way, it's much easier for us to identify the exact problem!

Without one, we can only guess, but if that's all your code I'd guess the NullPointerException comes from the title field. Here:

public void drawTitle(Canvas canvas) {
    String title = getTitle();
    canvas.drawText(title,30, 48, titlePaint);              
}

You are using the value of title, and I don't see it initialized anywhere. That String reference is most likely null.


You need to move your paint setup into the constructor:

public DigitalDial(Context context) {         
  super(context);         

  titlePaint = new Paint();         
  titlePaint.setStyle(Paint.Style.FILL);         
  titlePaint.setTypeface(Typeface.DEFAULT_BOLD);         
  //paint.setTextAlign(Paint.Align.RIGHT);         
  titlePaint.setColor(Color.YELLOW);         
  titlePaint.setAntiAlias(true);         
  titlePaint.setTextSize(28); 

} 

You are creating a new paint object with each draw which is very bad for efficiency. You also don't need overloaded constructors because you know how you are going to instantiate the custom view and it is unlikely you will do it in three different ways in your app.

Plus Santiago is right the first time you draw your tile will be null hence you should say at the top:

private String title = "";

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜