当前位置: 首页 > 知识库问答 >
问题:

作为目标重新发送异常错误

郎诚
2023-03-14

当我调用非静态方法时,会出现以下错误:

NullReferenceException RealmRecuition。ResolveRealmFestival()(位于Assets/Scripts/Card Manipulation/Realm Cards/Behaviors/realmrecuition.cs:14)系统。反射单一方法。Invoke(System.Object obj、BindingFlags invokeAttr、System.Reflection.Binder Binder、System.Object[]参数、System.Globalization.CultureInfo culture)(在/Users/builduser/buildslave/mono runtime和classlibs/build/mcs/class/corlib/System.Reflection/monmethod.cs:222)以targetingException的形式返回:调用目标引发异常。系统反射单一方法。调用(System.Object obj、BindingFlags invokeAttr、System.Reflection.Binder Binder、System.Object[]参数、System.Globalization.CultureInfo culture)(在/Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.Reflection/monmethod.cs:232)系统。反射MethodBase。调用(System.Object obj,System.Object[]参数)(at/Users/builduser/buildslave/mono runtime和classlibs/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)RealmCardManager。OnMouseDown()(位于Assets/Scripts/Card Manipulation/Realm Cards/realmcards/RealmCardManager.cs:48)UnityEngine。SendMouseEvents:DoSendMouseEvents(Int32)

下面是调用RealmCardManager中显示的各个方法的代码。OnMouseDown()消息,其上方为斜体。(注:我删去了不相关的代码):

public class RealmCardManager : MonoBehaviour {
    void OnMouseDown(){     
        Type classType = Type.GetType(CardBehavior);
        ConstructorInfo rCon = classType.GetConstructor(Type.EmptyTypes);
        object cardResult = rCon.Invoke(new object[]{});
        MethodInfo theMethod = classType.GetMethod("Resolve" + CardBehavior, BindingFlags.Instance | BindingFlags.Public);  
        theMethod.Invoke(cardResult, null);
    }
}

上面的代码基于字符串行为调用各个方法,在本例中调用的方法如下

public class RealmFestival : MonoBehaviour {
    public PoliticalProblems pP;
    public void ResolveRealmFestival(){
        pP = gameObject.AddComponent<PoliticalProblems>();
        pP.AdjustHeresy(false);
    }
}

最后调用以下代码:

public class PoliticalProblems: MonoBehaviour {
    public void AdjustHeresy(bool increase){
        if(increase){
            GameData.RealmLevels[2] ++;
        } else {
            GameData.RealmLevels[2] --;
        }
    }
}

如果我将AdjustHeresy更改为Static,那么代码就可以完美地工作(当然,我会在RealmFestival中对调用进行其他更改)。然而,我不能将该方法作为静态。

我试过把政治问题放在游戏对象上,让它独立,但它仍然没有改变错误信息

提前谢谢你

应要求(并在BatteryBackupUnit的协助下),我将此作为内部异常:

系统反射TargetInvocationException:调用的目标已引发异常---

共有1个答案

黄涵畅
2023-03-14

根据Unity文件:

请有经验的程序员注意:您可能会惊讶于对象的初始化不是使用构造函数完成的。这是因为对象的构造是由编辑器处理的,而不是在游戏开始时进行的。如果试图为脚本组件定义构造函数,它将干扰Unity的正常运行,并可能导致项目出现重大问题。

在你的例子中,不管怎样,RealmFestival不需要是一个单行为:它所做的只是将一个Political问题组件附加到一个游戏对象上。事实上,它也不需要是一个类——在这种情况下,一个静态函数就足够了(除非你需要跟踪状态——但看起来这可以由Political问题组件来完成):

public class CardEffects
{
    public static void ResolveRealmFestival(GameObject gameObject)
    {
        var politicalProblems = gameObject.AddComponent<PoliticalProblems>();
        politicalProblems.AdjustHeresy(false);
    }
}

从代码中不清楚字符串CardBehavior来自何处(我假设它是卡对象的属性),但是如果使用操作

public class Card
{
    //public string CardBehaviour;
    public Action<GameObject> CardBehaviour;

    public void ApplyCardEffect(GameObject target)
    {
        // Instead of reflection, we can simply invoke the Action directly - assuming it's not null:
        CardBehaviour(target);
    }
}

卡初始化代码将相应更改:

//card.CardBehaviour = "RealmFestival";
card.CardBehaviour = CardEffects.ResolveRealmFestival;

 类似资料:
  • 我有代码: 这是我的项目结构:https://imgur.com/a/5ipF1 这是我的错误消息: 这很奇怪,因为在我将Gradle添加到项目之前它就起作用了。添加Gradle后,我不得不将“src”备注为“源根”。 此结构是智能为 JavaFX 项目生成的基本结构。 有什么想法吗?

  • System.ObjectDisposedException:无法访问已释放的对象。对象名称:“System.net.Sockets.NetworkStream”。在system.net.sockets.networkstream.read(Byte[]缓冲区,Int32偏移量,Int32大小) 我的问题是我做错了什么?以及重新连接到服务器的最佳解决方案是什么?我的代码如下所示:

  • 我在让Ajax正常工作方面遇到了问题。在我这里的xhtml文件中,我使用Ajax来呈现一些启用或禁用的输入,它可以正常工作。然而,更进一步,我还使用Ajax来呈现包含的xhtml文件,其中包含一个控件,并用id=“photoEnabled”标记。如果未选中该复选框,则会在其位置显示id=“photoDisabled”标记的虚拟显示,只是为了在页面上呈现整洁,并且该显示被禁用。 出于某种原因,这不起

  • 我的主类似乎找不到我的 fmxl 文件,但我很确定路径是正确的。我不明白发生了什么。 这里是我的主要 我收到的错误是 Main.java:74 的错误是我的加载程序调用我不明白错误是由找不到我的fxml文件引起的?

  • 这是我第一次处理SSLSockets, 谢谢你, 编辑1:我启用了调试,这是调试:

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。