2016-11-25 163 views
-1

我知道这听起来很简单,但我在初始化对象时遇到了问题。每当我运行我的代码。我不断收到错误。我需要初始化上线27C#初始化对象

遭遇“”类型的未处理的异常“System.NullReferenceException”发生在WPFBattle.exe”。‘

于是我问别人,他们告诉我

’你忘记在MainWindow的构造函数中初始化遇到了,因为你没有初始化它,但仍然将它传入,遇到的是空值,这意味着你不能调用autobattle。公共icombat遭遇是声明,它不是初始化它可以像使用new关键字和战斗构造函数一样使用任何用户定义的对象来初始化它。“

所以我试图做到这一点,但我不断收到错误。我不知道为什么它不工作。我重视我的代码的图片,任何帮助将不胜感激

PICTURE OF MY CODE

PICTURE OF MY CODE 2

1 namespace WPFBattle 
2 { 
3  
4  
5  public partial class MainWindow : Window 
6  { 
7   private TextBoxStreamWriter consoleWriter; 
8   private TextBox outputField; 
9   private IList<ICharacter> playerParty = new List<ICharacter>(); 
10   public ICombat encounter; 
11   private CombatThread combatThread; 
12  
13   public MainWindow() 
14   { 
15    InitializeComponent(); 
16  
17    // Redirect console 
18    consoleWriter = new TextBoxStreamWriter(outputField); 
19    Console.SetOut(consoleWriter); 
20  
21    //creates the two parties 
22    List<ICharacter> party = new List<ICharacter>(); 
23    List<ICharacter> enemy = new List<ICharacter>(); 
24  
25  
26  
27    //PLACE I NEED TO INITIALIZE MY OBJECT AT 
28  
29  
30    combatThread = new CombatThread(encounter); 
31    combatThread.Start(); 
32   } 
33  
34   private void textBox_TextChanged(object sender, TextChangedEventArgs e) 
35   {  
36  
37   } 
38  
39  
40  } 
41 } 
+0

你有任何继承ICombat的类吗?你可能会遇到类似于=新的Combat(); – Davatar

+0

@Davatar谢谢你的回应。在第一张图片附件中,我包含了我的CombatThread代码。 – firmfiasco

+0

@MohitShrivastava我之前看到过这个问题,并通读了解答案,但我无法找到一种方法来实现它与我的代码 – firmfiasco

回答

1

在第10行:你有下面的代码:

public ICombat encounter; 

但这个变量的遭遇永远不会成为一个值。所以它是空的。在第30行:你将这个空值传递给你的combatThread。

combatThread = new CombatThread(encounter); 

如果combatThread访问遭遇类似的地方:

encounter.DoSth(); 

,则会引发

的NullReferenceException

因为遇到的是类型ICombat的,这是一个接口,你不能使用它的新操作符。你需要一个实现这个接口的类。

public class Combat : ICombat 
{ 
    //Implement what the Interface need 
} 

并为您的遭遇引用创建一个新的对象。

encounter = new Combat(); //IMPORTANT 
combatThread = new CombatThread(encounter); 
combatThread.Start(); 
+0

非常感谢! – firmfiasco

+0

@firmfiasco你是怎么做TextBoxStreamWriter类的? – wolfclique

0

要初始化遇到需要调用

public class Combat : ICombat 
{ 
    //Combat class 
} 

encounter = new Combat()//and of course provide necessary parameters if needed 

虽然因为你”我已经试过,我猜这个问题在别的地方。 你如何在CombatThread中使用相遇?我猜你在CombatThread中保留了一个引用,但是已经忘记了或者对CombatThread.mEncounter进行了错误的分配。

在CombatThread中你如何初始化遇到的引用?

+0

谢谢你的回应。在第一张图片附件中,我包含了我的CombatThread代码。 – firmfiasco

+0

如果你在CombatThread.Thread.Start()上放置一个断点,是否真的遇到null? Autobattle()会发生什么?也许空引用是从那里抛出的? – user3532232

+0

我在第30行添加了一个断点,它工作正常,但是当我继续行31时,它会抛出null refrence。 – firmfiasco