我在一个字符串数组上得到一个Null引用异常(我认为)。所以我输入一个语句来检查我的数组是否为null,它仍然被抛出。我正在使用Unity,所以我的调试工具不是很好。无论如何,我可以让Unity或Visual Studio在这里吐出什么是null?我有点不知所措。我很确定这个数组已经被实例化,因为我知道它不是因为我的语句而为空,而且两个,这个代码运行多次就好了。只有在我填满选项然后删除我得到Null Reference的选项之后。我正在使用引擎(Dialoguer),但我希望它不相关。
- 编辑 -
经过一番调试后,我发现了以下内容。删除choices.Length行删除了NRE,下面的代码按原样运行,假设输入选择的数量是两个:
for (int i = 0; i < 2/*choices.Length*/; i++)
{
Debug.Log(choices[i]);
if (GUI.Button(new Rect(10, 220 + (40 * i), 200, 30), choices[i]))
{
Dialoguer.ContinueDialogue(i);
}
}
代码在choices [i]中正确打印两个字符串的名称。所以我从中读到的是我的数组有元素,并且不是null,但是由于某种原因,Array.Length属性返回null。这是对的吗?
感谢阅读!
if(choices != null && choices.Length > 0)
{
for (int i = 0; i < choices.Length; i++) //NRE is thrown here.
{
if (GUI.Button(new Rect(10, 220 + (40 * i), 200, 30), choices[i]))
{
Dialoguer.ContinueDialogue(i);
}
}
}
完整代码(新):
using UnityEngine;
使用System.Collections;
public class DialoguerGUI:MonoBehaviour {
private bool isShowing;
private string text;
private string[] choices;
// Use this for initialization
void Start() {
choices = new string[19];
Dialoguer.events.onStarted += onStarted;
Dialoguer.events.onEnded += onEnded;
Dialoguer.events.onTextPhase += onTextPhase;
}
void OnGUI()
{
if (!isShowing)
return;
GUI.Box(new Rect(10, 10, 200, 150), text);
if (choices == null)
{
if (GUI.Button(new Rect(10, 220, 200, 30), "continue"))
{
Dialoguer.ContinueDialogue();
}
} else
{
for (int i = 0; i < 2/*choices.Length*/; i++)
{
Debug.Log(choices[i]);
if (GUI.Button(new Rect(10, 220 + (40 * i), 200, 30), choices[i]))
{
Dialoguer.ContinueDialogue(i);
}
}
}
}
// Update is called once per frame
void Update() {
}
private void onStarted()
{
isShowing = true;
}
private void onEnded()
{
isShowing = false;
}
private void onTextPhase(DialoguerTextData data)
{
text = data.text;
choices = data.choices;
}
}
完整代码(旧):
using UnityEngine;
using System.Collections;
public class DialoguerGUI : MonoBehaviour {
private bool isShowing;
private string text;
private string[] choices;
// Use this for initialization
void Start() {
Dialoguer.events.onStarted += onStarted;
Dialoguer.events.onEnded += onEnded;
Dialoguer.events.onTextPhase += onTextPhase;
}
void OnGUI()
{
if (!isShowing)
return;
GUI.Box(new Rect(10, 10, 200, 150), text);
if (choices == null)
{
if (GUI.Button(new Rect(10, 220, 200, 30), "continue"))
{
Dialoguer.ContinueDialogue();
}
} else
{
if(choices != null && choices.Length > 0)
{
for (int i = 0; i < choices.Length; i++)
{
if (GUI.Button(new Rect(10, 220 + (40 * i), 200, 30), choices[i]))
{
Dialoguer.ContinueDialogue(i);
}
}
}
}
}
// Update is called once per frame
void Update() {
}
private void onStarted()
{
isShowing = true;
}
private void onEnded()
{
isShowing = false;
}
private void onTextPhase(DialoguerTextData data)
{
text = data.text;
choices = data.choices;
}
}
答案 0 :(得分:1)
不确定问题的根源是什么,但这就是为什么你的if
语句检查没有阻止错误的原因:
这一行:if(choices != null && choices.Length > 0)
检查数组是否已初始化。
问题是,即使数组已初始化,也不是说它具有您需要的初始化元素数或者每个元素都已正确初始化。在此检查之后,您立即遍历数组并尝试使用其中的数据。如果存在初始化问题,则会出错。
答案 1 :(得分:0)
您忘了指定数组的大小。
只需将// call this function , if true , go ahead ,storage available
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
放入choices = new string[50];
功能即可。将50替换为您希望Start()
变量保持的字符串数组的数量/大小。
choices