【问题标题】:Android java.lang.IllegalArgumentExceptionAndroid java.lang.IllegalArgumentException
【发布时间】:2012-03-20 18:04:43
【问题描述】:

这可能是一个简单的回答,但我似乎无法正确回答,我想我会问。 我得到一个 java.lang.IllegalArgumentException 和一个 java.lang.NullPointerException

这是错误日志

 03-20 13:13:22.872: E/SurfaceTextureClient(565): dequeueBuffer failed (No such device)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565): Exception locking surface
 03-20 13:13:22.879: E/BaseSurfaceHolder(565): java.lang.IllegalArgumentException
 03-20 13:13:22.879: E/BaseSurfaceHolder(565): at android.view.Surface.lockCanvasNative(Native Method)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565):  at android.view.Surface.lockCanvas(Surface.java:76)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565):  at com.android.internal.view.BaseSurfaceHolder.internalLockCanvas(BaseSurfaceHolder.java:184)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565):  at com.android.internal.view.BaseSurfaceHolder.lockCanvas(BaseSurfaceHolder.java:161)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565):  at ca.watercity.CityActivity$Blimp.render(CityActivity.java:235)
 03-20 13:13:22.879: E/BaseSurfaceHolder(565):  at ca.city.CityActivity$CityThread.run(CityActivity.java:580)
 03-20 13:13:22.879: W/dalvikvm(565): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
 03-20 13:13:22.889: E/AndroidRuntime(565): FATAL EXCEPTION: Thread-79
 03-20 13:13:22.889: E/AndroidRuntime(565): java.lang.NullPointerException
 03-20 13:13:22.889: E/AndroidRuntime(565):     at ca.city.CityActivity$Blimp.render(CityActivity.java:237)
 03-20 13:13:22.889: E/AndroidRuntime(565):     at ca.city.CityActivity$CityThread.run(CityActivity.java:580)


 03-20 13:26:12.633: E/AndroidRuntime(564): java.lang.NullPointerException

这是它影响的两行代码。

 public void render(){
            Canvas canvas = null;
            try{
                // line 235
                canvas = this._surfaceHolder.lockCanvas(null);
                synchronized (this._surfaceHolder) {
                    canvas.save();
                    this.onDraw(canvas);
                    canvas.restore();
                }
            }finally{
                if(canvas != null){
                    this._surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }   
        }

还有这几行代码。

  @Override
        public void run() {
            while(this._running){
                this._blimp.render();
            }
        } // line 580

对此的任何帮助将不胜感激。 提前谢谢你。

【问题讨论】:

    标签: android nullpointerexception illegalargumentexception


    【解决方案1】:

    您将 null 传递给 SurfaceHolder.lockCanvas。您想改用 lockCanvas() 的无参数版本,假设您没有想要被视为脏的 rect。

    【讨论】:

    • 感谢您消除了 null 异常,但在相同的两行代码中我仍然有 java.lang.IllegalArgumentException 错误。不知道是什么导致了这个错误,我应该提到这只发生在 android 4 及以上的任何东西都很好并且不会导致错误只是 android 4 及以上,也许它与那个版本有关。
    • 是一个奇怪的问题,感谢您摆脱了一半的问题,我很感激,如果我找到答案,我会继续挖掘并发布,除非其他人有这个问题的答案。
    • 顺便说一下,错误现​​在发生在 unlockCanvasAndPost(canvas);对于 java.lang.IllegalArgumentException 错误。以为我会添加。
    • 当 Canvas 被锁定并再次锁定(未解锁)时会发生这种情况。如果再次调用 render() 并且您没有机会解锁先前的画布,则这种情况可能会发生在您的代码中
    【解决方案2】:

    无论您的Canvas 实例是否已锁定,都保存在boolean 中,以避免在您的Canvas 从先前的lockCanvas() 调用解锁之前执行unockCanvasAndPost() 方法:

    private boolean canvasLocked;
    
    public void render() {
        Canvas canvas = null;
        try {
            // line 235
            if (!canvasLocked) {
                canvas = this._surfaceHolder.lockCanvas(null);
                canvasLocked = true;
                synchronized (this._surfaceHolder) {
                    canvas.save();
                    this.onDraw(canvas);
                    canvas.restore();
                }
            }
        } finally {
            if (canvas != null) {
                this._surfaceHolder.unlockCanvasAndPost(canvas);
                canvasLocked = false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 2021-12-13
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多