我想看看是否初始化事件但是出错了

时间:2015-06-27 20:58:08

标签: java android initialization

我有2个班级,第一个是Sprite,第二个是GameView。我在GameView类中有一个onTouchEvent,我想在touchevent上更改精灵方向和动画。但是,我试图在sprite类中解决事件的任何方式都得到Variable might not have been initialized因此我想检查事件是否已初始化 - 这给了我同样的错误!

Sprite类:

    MotionEvent event;  // These three declarations is just to get them in
    int xcoords;        // the scope - not sure it's the right way.
    int ycoords;

    if (gameView.onTouchEvent(event, xcoords, ycoords) != null) {  // This
    // gives me the error, specifically on event, xcoords and ycoords.

        MotionEvent event = this.gameView.onTouchEvent(event.getPointerCount());
        int isPushedDown = event.getPointerCount();

        if (isPushedDown == 0) {

            srcX = 1;
            srcY = 3;

            Rect srcNoMove = new Rect(srcX, srcY, srcX, srcY);

            canvas.drawBitmap(bmp, srcNoMove, dst, null);

        }

    }

GameView事件:

public boolean onTouchEvent(MotionEvent event, float xcoord, float ycoord) {
        if (System.currentTimeMillis() - lastClick > 500) {
            lastClick = System.currentTimeMillis();
    }

    xcoord = event.getX();
    ycoord = event.getY();

    return onTouchEvent(event, xcoord, ycoord);

}

如何解决此问题? 使用null和2 = 0;声明上面的变量会产生布尔值不能为空并且执行if (!gameView.onTouchEvent(event)) {而不仅仅返回上述空值的问题吗?

我想检查变量是否已启动,如果是,请执行某些操作。

4 个答案:

答案 0 :(得分:1)

这里的问题是未初始化的变量与初始化的变量之间存在差异,但值为$(function() { $('#SketchPad').sketch(); $("#DownloadPng").on("click", function(e) { e.preventDefault(); var canvas = document.getElementById('SketchPad'); var ctx = canvas.getContext('2d'); var style = $("style"); var data = '<svg xmlns="http://www.w3.org/2000/svg" width="1125" height="600">' + '<foreignObject width="100%" height="100%">' + '<div xmlns="http://www.w3.org/1999/xhtml">' + $(".message")[0].outerHTML + '</div>' + '<style xmlns="http://www.w3.org/1999/xhtml">' + style[0].innerHTML + '</style>' + '</foreignObject>' + '</svg>'; var DOMURL = window.URL || window.webkitURL || window; var svg = new Blob([data], {type: 'image/svg+xml;charset=utf-8'}); var url = DOMURL.createObjectURL(svg); var popup = window.open(url, "popup") }) }); 。如果变量未初始化(例如问题中的null event,xcoords),则无法将其用于任何,包括检查对于ycoords值。在以任何方式使用变量之前,必须确保将变量初始化为某个值。

答案 1 :(得分:1)

如果你想摆脱Variable might not be initialized,你可以声明一个初始值为null的对象,然后再测试一个空值(如if(object != null))。

与原语不同,因为它们不能为空。但是,Java中内置了一些使用这些原语作为基础的类。

您可以将int xcoords更改为Integer xcoords = null。然后它将具有null值,您可以使用我上面描述的语法适当地测试空值。

Java为每个原语都有这样的类。 intIntegerbooleanBoolean等。其中大多数应该很容易理解。

答案 2 :(得分:1)

首先。

MotionEvent event = this.gameView.onTouchEvent(event.getPointerCount());

糟糕的做法。

二次

if (gameView.onTouchEvent(event, xcoords, ycoords) != null) {

糟糕的做法。 onTouchEvent必须返回布尔结果。不是一个对象。

<小时/>

然而

您需要在使用前初始化变量。 &#34;非常聪明&#34; Java编译器会给你带来错误,因为很可能你在运行时有NullPointerException

MotionEvent event;

if(event.getX() != 0f) // compile error.

FIX:

MotionEvent event = null; // In good case - you need use obtain(...) method of MotionEvent class.

if(event!=null && event.getX() != 0f) // All ok.

答案 3 :(得分:1)

首先没有足够的代码来确切地说明发生了什么,其余代码相当糟糕,我甚至无法想象你在这里尝试做什么以及你的实际问题是什么。也许你在尝试以错误的方式修复它之前的第一个草案代码会更有说服力。

gameView.onTouchEvent(event, xcoords, ycoords) != null 

在上面的代码中,您实际上并不是在比较是否在上面的代码中分配了onTouchEvent,而是在调用它,并且由于其返回值为boolean,因此您无法将其与null进行比较

如果gameViewGameView课程的实例,那么您不必检查您的事件是否已初始化(实际上,这不是事件,而是您GameView的方法如果gameView变量已初始化,您可以使用它。你很可能真的想测试gameView != null

您的GameView onTouchEvent方法也会以return onTouchEvent(event, xcoord, ycoord);递归调用自身

虽然您的代码确实存在问题,但这里真正的问题似乎是您想要快速前进,而您正试图跳过学习基础知识。另一个问题是当你碰到一个问题时,你正在听编译器试图纯粹地满足它的错误而不考虑你实际在做什么。编译器是愚蠢的,不要让他们一路领先。你是这里的老板。

因此,当编译器告诉您在范围内没有变量event时,您必须停下来思考实际含义是什么。你真的需要event变量吗?如果你只是忘了声明它,那就继续做吧,但如果这种错误(或任何其他错误)让你感到惊讶,那么你必须停下来重新考虑你的步骤。

现在回到一些基础知识。

public class GameView
{
   // onTouchEvent is method of GameView class
   // it can only be called on valid (non-null) instance of GameView class
   // when you have valid instance of GameView class all its methods 
   // can be used, you don't have to check whether they are null 
   //
   // return value of onTouchEvent is declared as boolean and that 
   // is the only value it can possibly return
   // passed parameters are event, xcoord and ycoord and they can be used inside 
   // onTouchEvent the way you see fit. 
   // since event is object (depending on class design) you can change its state and 
   // those changes will be preserved after onTouchEvent finishes. 
   // xcoord and ycoord are primitive types passed as value and whatever 
   // you do to them those changes will not survive after onTouchEvent.

   public boolean onTouchEvent(MotionEvent event, float xcoord, float ycoord) 
   {         
      xcoord = event.getX(); // this value will be lost the moment onTouchEvent returns
      return true; // or return false 
   }

}

课程设计中的第一个问题是当用户触摸屏幕时应该发生什么。您的Sprite是否必须对仅在触摸实际Sprite位置时发生的触摸事件做出反应,或者无论触摸发生在何处都必须做出反应。在第一种情况下,最好的做法是直接在Sprite类中实现触摸检测。在第二种情况下,您必须在GameView类中实现触摸检测,然后指示您的精灵实例执行某些操作。

我假设SpriteGameView都在扩展View类,因此我们可以使用默认触摸事件调度覆盖onTouchEvent方法。

第一种方式 - 在Sprite内处理触摸。在这种情况下,GameView不需要了解Sprite的任何内容,也不需要Sprite实例

public class Sprite extends View
{
        public boolean onTouchEvent(MotionEvent event)
        {
            // do your movement logic
            return true; // return true if we are handling the event, false otherwise
        }
} 

第二种方式 - 在GameView中进行触摸处理。在这种情况下,GameView必须保留有效的Sprite实例

public class Sprite extends View
{
    public void move(float x, float y)
    {
    // do your movement logic here 
    }
} 

public class GameView extends View
{
    public Sprite sprite; // you have to initialize that sprite instance before you can use it 
    // - most likely in Activity onCreate method, but that will depend on your game logic

    public boolean onTouchEvent(MotionEvent event)
    {
        sprite.move(event.GetX(), event.GetY());
        return true; // return true if we are handling the event, false otherwise
    }
}