当我尝试在 android studio 中调试时陷入收集数据的困境

신승빈*_*신승빈 27 java debugging android android-studio

我试图通过单例模式编写代码。

这是我的主要活动。

public class MainActivity extends AppCompatActivity {

public static MainActivity activity;
public TouchSensor touchSensor;
public SurfaceViewThread surfaceViewThread;
public TriggerChecker triggerChecker;

public Physics physics;

//public static Handler mHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    activity = this;
    surfaceViewThread = SurfaceViewThread.getInstance();
    touchSensor = TouchSensor.getInstance();
    triggerChecker = TriggerChecker.getInstance();
    physics = Physics.getInstance();

    touchSensor.start();
    triggerChecker.start();
    physics.start();
    //surfaceViewThread is already started.

    activity.setContentView(surfaceViewThread);
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试通过单例模式编写的代码。

public class SurfaceViewThread extends SurfaceView implements Runnable, SurfaceHolder.Callback {

private static SurfaceViewThread surfaceViewThread = new SurfaceViewThread();

private static Camera camera;
private SurfaceHolder holder;
private Thread thread;
private boolean run;

private Vector<ObjectGraphic> objects;
private Vector<Graphic> UIs;
private ObjectGraphic field;

private Vector<ObjectGraphic> draws;
private ComponentMessage componentMessage;

public static SurfaceViewThread getInstance()
{
    if(surfaceViewThread == null)
        surfaceViewThread = new SurfaceViewThread();
    return surfaceViewThread;
}
private SurfaceViewThread()
{
    super(activity.getApplicationContext());
    camera = new Camera();
    getHolder().addCallback(this);
    holder = getHolder();
    objects = new Vector<>();
    UIs = new Vector<>();

    draws = new Vector<>();

    run = false;

    componentMessage = new ComponentMessage();
}
Run Code Online (Sandbox Code Playgroud)

当我构建此代码时,Camera 类因 NullPointException 崩溃。

public class Camera extends GameObject {

private Rect area;
private int sight;
private int maxSight = 50;
private int minSight = 10;
private int[] fieldOfView;//{vertical, horizontal}
private int[] maxFieldOfView = new int[] { 60, 45 };
private int[] minFieldOfView = new int[] { 10, 10 };

public Camera()
{
    super();
    area = new Rect();
    this.fieldOfView = new int[] { 60, 45 };
    objectMatrix.Rotate(objectMatrix.xVector(), Math.toRadians(-45));

    setDisplayVector();
}
private void setSight()
{
    double angle = Math.PI/2 - Math.acos(new Common_Math.Matrix1X4(0, 1, 0, 0).Inner(objectMatrix.zVector().Invert()));
    if(angle < 0 && angle > - Math.PI/2) {
        double t = -objectMatrix.qVector().getY() / objectMatrix.zVector().getY();
        int x = (int) (objectMatrix.zVector().getX() * t + objectMatrix.qVector().getX());
        int z = (int) (objectMatrix.zVector().getZ() * t + objectMatrix.qVector().getZ());

        sight = (int)Math.sqrt(Math.pow((x - objectMatrix.qVector().getX()), 2) + Math.pow((objectMatrix.qVector().getY()), 2) + Math.pow((z - objectMatrix.qVector().getZ()), 2));
        if(sight < minSight)
            sight = minSight;
    }
    else
    {
        sight = maxSight;
    }
}
private void setDisplayVector()
{
    setSight();
    Common_Math.Matrix1X4 upVector, downVector, leftVector, rightVector;
    Common_Math.Matrix1X4 zVector = objectMatrix.zVector();

    upVector = zVector.Rotate(objectMatrix.xVector(), fieldOfView[0]);
    downVector = zVector.Rotate(objectMatrix.xVector(), -fieldOfView[0]);
    leftVector = zVector.Rotate(objectMatrix.yVector(), fieldOfView[1]);
    rightVector = zVector.Rotate(objectMatrix.yVector(), -fieldOfView[1]);

    double angle = Math.PI/2 - Math.acos(new Common_Math.Matrix1X4(0, 1, 0, 0).Inner(objectMatrix.zVector().Invert()));
    upVector = upVector.Scaled((int)(Math.abs(objectMatrix.qVector().getY() * Math.tan(angle + fieldOfView[0]))));
    downVector = downVector.Scaled((int)(Math.abs(objectMatrix.qVector().getY() * Math.tan(angle - fieldOfView[0]))));
    leftVector = leftVector.Scaled((int)(sight * Math.asin(fieldOfView[1])));
    rightVector = rightVector.Scaled((int)(sight * Math.asin(fieldOfView[1])));

    area.left = (int) objectMatrix.qVector().Add(leftVector).getX();
    area.top = (int) objectMatrix.qVector().Add(upVector).getY();
    area.right = (int) objectMatrix.qVector().Add(rightVector).getX();
    area.bottom = (int) objectMatrix.qVector().Add(downVector).getY();
}
Run Code Online (Sandbox Code Playgroud)

这是 GameObject 类

public class GameObject {

protected GameObject upperGameObject;//if upperGameObject is null, this GameObject is parent GameObject.

protected Common_Math.Matrix4X4 objectMatrix;
private Vector<SeaWeedComponent> componentVector;

public GameObject()
{
    objectMatrix = new Common_Math.Matrix4X4();
    AllocatePhysicsSpace();
    componentVector = new Vector<>();
}
Run Code Online (Sandbox Code Playgroud)

和 Matrix4x4 类

public static class Matrix4X4
{
    private Matrix1X4 xVector, yVector, zVector, qVector;

    public Matrix4X4() {
        xVector = new Matrix1X4(1, 0, 0, 0);
        yVector = new Matrix1X4(0, 1, 0, 0);
        zVector = new Matrix1X4(0, 0, 1, 0);
        qVector = new Matrix1X4(0, 0, 0, 1);
    }
Run Code Online (Sandbox Code Playgroud)

所以我检查了一个断点来看看为什么会发生这种情况,但是当我调试它时,每个变量都停留在“收集数据..”并且没有任何反应。甚至调试器响应也变慢。

我无法猜测为什么会发生这种情况。我的代码有问题吗?我怎样才能看到变量?

Vic*_*ira 39

我遇到了这个问题。为了解决这个问题,对于单个对象,帮助我的是右键单击卡住的对象,然后转到view as并选择object而不是Kotlin class

在此输入图像描述

在此输入图像描述

作为一个明确的措施,这个答案可能是一个可能的解决方案,但它对我不起作用

Android Studio Electric Eel | 2022.1.1
Build #AI-221.6008.13.2211.9477386, built on January 11, 2023
Runtime version: 11.0.15+0-b2043.56-8887301 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 12.6.2
Run Code Online (Sandbox Code Playgroud)

  • 当我右键单击该对象时,它只显示加载指示器。 (4认同)
  • 我认为这与更新有关;这是一个五年前的问题,有些人很快就注意到我的回答。奇怪的是,我在 Canary 和稳定 AS 上都遇到了问题。无效缓存并没有解决我的问题;不确定从什么时候开始;几天前我还更新了我的 MacO;也许这是 Jetbrains/MacOS 的问题,可能很快就会修复 (3认同)
  • 您认为这与最新的 Android Studio 更新有关吗?我最近更新了电鳗,断点不起作用。之前,使用相同的断点,它仍然有效。 (2认同)
  • 看起来绝对像电鳗虫。我只是来这里解决同样的问题。 (2认同)

mir*_*mir 7

不确定这应该是评论还是答案......

我在完全不同的上下文中看到了同样的问题,它“以某种方式”与使用线程有关。似乎当调试器尝试获取一个值并且需要运行与另一个线程关联的内容时,它就会死锁。

就我而言,我有一个 javascript 引擎,当我需要执行 JS 时,它会在非 ui 线程上调用。如果我在任何地方有变量,例如 JSObject 的子类,调试器就会锁定。

我发现解决这个问题的唯一方法是明智地进行日志记录和设置断点。

检查您的代码在访问变量时是否遇到任何锁或同步语句,这可能是您的情况的原因。

直到这个问题得到解决,您可以在使用“Gson().toJson(yourObject)”调试 json 字符串时看到您的对象。


gek*_*n76 -1

GameObject.class 的作用是什么?您的 Camera 类正在扩展 GameObject.class 并在构造函数中调用 super() 。跳过调试器并使用经典日志记录在设置变量之前打印出来。

  • [更新]

Singleton 没有做任何特殊的事情,除了将自身保持为单个实例之外,不知道 Android Studio 调试器如何处理它们,但它应该不会有问题。当您尝试实例化 Camera.class 时,出现 NULL。

尝试在实例化 Camera() 时捕获 NullPointer

try {
    Camera cam = new Camera();
} catch (NullPointerException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪应该告诉您 NullPointer 在代码中的位置