请参阅链接:
http://i.imgur.com/gFcamd8.png
注意底部的Autos窗口显示toParse =""。然而toParse!=""无论如何,评估为真,导致应用程序崩溃。
这是完整的方法:
public void parseString(string toParse)
{
while (toParse != "")
{
string nextLine = readLine(ref toParse);
if (nextLine.IndexOf("//") == 0)
{
comments.Add(nextLine);
continue;
}
if (nextLine.IndexOf(".") == 0)
{
string[] declarationParts = nextLine.Split(' ');
string declarationString = declarationParts[0].Substring(1, declarationParts[0].Length - 1);
declarationString = char.ToUpper(declarationString[0]) + declarationString.Substring(1);
DirectiveEnum type = (DirectiveEnum)Enum.Parse(typeof(DirectiveEnum), declarationString);
string[] attributes = declarationParts.Skip(1).ToArray();
MSILNode newNode = new MSILNode(type);
newNode.addAttributes(attributes);
toParse = toParse.Trim();
if (toParse != "")
{
while (toParse[0] != '{' && toParse[0] != '.' && toParse.IndexOf("//") != 0)
{
nextLine = readLine(ref toParse);
attributes = nextLine.Split(' ');
newNode.addAttributes(attributes);
}
if (toParse[0] == '{')
{
readLine(ref toParse);
string inside = separate(ref toParse, "}");
newNode.parseString(inside);
}
}
subNodes.Add(newNode);
continue;
}
Console.WriteLine(nextLine);
}
}
答案 0 :(得分:2)
只有在给出这一个快照时,很难看到调试会话期间发生的所有事情。但是,由于toParse
是通过引用函数readline()
(第57行)传递的,因此可以在该函数的主体中更改它的值。
从原始问题中提供的PNG图像:
53 if (toParse != "")
54 {
55 while (toParse[0] != '{' && toParse[0] != '.' && toParse.IndexOf("//") != 0)
56 {
57 nextLine = readLine(ref toParse);
58 ...
在第53行,toParse
不为空。然后,在while
循环的一次迭代期间,它被更新为空值。这将导致对数组索引的任何访问(即while条件中的toParse[0]
)抛出异常。
有关C#中ref
关键字的详细信息,请参阅this StackOverflow issue或this official Microsoft documentation。
我希望这有帮助!
答案 1 :(得分:0)
在图像中,此行import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
object Json4sTest {
def main(arg: Array[String]) {
var json = parse("""{"name":"luca", "id": "1q2w3e4r5t", "age": 26, "inner": { "age": 27 }, "url":"http:// www.nosqlnocry.wordpress.com"}""")
println(pretty(json))
val a: List[Map[String, JValue]] = List(Map("inner/age" -> 35, "age" -> 27), Map("name" -> "foo"))
val r = jsonFieldUpdater(json, a)
println(pretty(r))
val b = List(Updater("inner/age", 35), Updater("age", 27), Updater("name", "foo"))
val s = jsonFieldUpdater2(json, b)
println(pretty(s))
}
def jsonFieldUpdater(json: JValue, list: List[Map[String, JValue]]): JValue =
list.foldLeft(json) { case (json, kvs) =>
kvs.foldLeft(json) { case (json, (key, value)) =>
json.replace(key.split("/").toList, value)
}
}
case class Updater(key: String, value: JValue) {
def path: List[String] = key.split("/").toList
}
def jsonFieldUpdater2(json: JValue, list: List[Updater]): JValue =
list.foldLeft(json) { case (json, u) =>
json.replace(u.path, u.value)
}
}
突出显示,表示它在Callstack中并在崩溃前被调用。这条线可能正在变为toParse""。