‫欢迎回来
‫在这段视频中, 我们将修复我们遇到的错误, 并看看我们如何解决它｡
‫所以在这个例子中, 它是一个非常基本的例子｡
‫我们确实知道我们有这个方法来正确地处理逻辑｡
‫所以这是一个能判断一个朋友是否是派对上的朋友的软件｡
‫这通常会帮助你进行调试, 因为如果你知道一个特定的方法会做什么,
‫你就可以在那个点上创建一个断点｡
‫好吧, 我会的
‫所以如果你在一个你从未用过或见过的程序中工作, 那么你, 当然, 首先,
‫需要深入研究它, 了解所有方法的作用｡
‫这就是为什么, 当然, 有一个关于这里发生的事情的总结是很有用的｡
‫好吧, 我会的
‫所以解释一下｡
‫好吧, 我会的
‫list是做什么的？
‫这种方法的总结是什么？
‫所以你可以在这里使用三个步骤, 然后你可以添加一个小总结｡
‫所以这就是找出谁是派对朋友或者谁会是派对朋友之类的逻辑｡
‫这不是完美的英语在这里, 但我想你明白的想法是什么｡
‫所以一旦你做到了, 你就会知道了, 好吧｡
‫好吧, 这就是逻辑所在｡
‫我们的程序是自动运行的, 对吧？
‫所以它或多或少都能正常工作, 当然, 除了它显示我们, 朋友们, 我们有一个长名字,
‫而不是短名字｡
‫所以最有可能的问题在于我们如何选择东西的逻辑｡
‫我们已经看到了｡
‫好吧, 可能吧｡
‫这是我们遇到问题的方法, 所以我们可以去掉这个断点, 还有这个断点｡
‫然后我们可以看看我们的方法｡
‫所以我们只需要添加一个断点和/或获取party friend方法, 然后我们就可以查看它了｡
‫我们就从这开始吧｡
‫重要的当然是价值观, 对吧？
‫所以我们想知道这些值｡
‫在这种情况下, 我们对最短的名字感兴趣, 也可能对长度感兴趣, 因为这是逻辑, 对吗？
‫所以我们要做的是进入下一步｡
‫我们可以看到, 这个列表由七个值组成, 这是很好的｡
‫看来这是可行的｡
‫我们所有的朋友都在里面｡
‫所以在那之前, 一切似乎都很好｡
‫然后我们进行下一步｡
‫所以我们有眼睛, 也就是我们的｡
‫计数器显示为零｡
‫好了, 这是OC｡
‫折扣数是7, 所以我们可以进入下一步｡
‫现在我们有一个比较｡
‫如果列表I长度较大则长度最短｡
‫我们可以看到最短的名字是弗兰克｡
‫这就是我们开始的那个｡
‫对不对？
‫所以名单从弗兰克开始｡
‫所以在列表I, 也就是零, 我们会有弗兰克｡
‫所以没关系｡
‫现在让我们进入下一步, 因为if语句中的条件似乎不为真｡
‫好吧, 我会的
‫然后我们可以进入下一个迭代或下一步, 再次进行比较｡
‫现在我们所看到的名单仍然是七个人｡
‫然后我们得到了一个字符串长度, 它是3, 另一个是5｡
‫这是怎么回事？
‫我们正在查找Joe, Joe应该是列表中的下一个, 因为他的名字比Frank短｡
‫这是我们知道的, 因为我们编写了程序｡
‫但出于某种原因, 当然, 这个名字仍然是弗兰克｡
‫所以我们可以在这一点上实现我们的目标｡
‫好吧, 我会的
‫所以可能是这里出错了｡
‫所以我们比较的是大于, 尽管它应该小于, 或者小于.
‫现在如果我们去掉断点, 再运行一次程序, 我们就能看到了.
‫好了, 我们得到最短的名字, 乔和D, 弗兰克和玛丽亚｡
‫好吧, 那太好了｡
‫所以现在我们的程序又恢复了自由｡
‫当然, 这并不是因为我们还有很多问题｡
‫其中之一就是我们有一个名单, 上面有弗兰克, 乔, 米歇尔等等｡
‫好吧, 我会的
‫所以我们手动创建了列表, 这样我们就知道里面有什么｡
‫但现在我们假设我们想邀请十个人, 但我们的女儿给了我们一个七人的名单｡
‫让我们运行这段代码｡
‫还有｡
‫我们有一个例外｡
‫好极了｡
‫这就是例外的好处｡
‫你知道你的代码有问题, 你可以修复它, 因为有时候, 正如我们刚刚看到的,
‫如果你没有看到错误, 它们是非常难以修复的｡
‫这里是参数超出范围, 异常索引超出范围, 必须是非负的, 并且小于集合的大小｡
‫因此您可以查看有关此内容的详细信息｡
‫您可以看到更多有关此异常的信息, 它将告诉您需要了解的所有信息｡
‫好吧, 我知道了
‫这么一大堆资料｡
‫大多数时候都太多了｡
‫但这表明我们试图访问列表中的一个元素, 它超出了我们的范围｡
‫那会是什么呢？
‫可能是我们要访问的列表, 所以我们可以转到这里｡
‫我们可以看到我们有一个例外｡
‫我们有一个名单, 计数为零｡
‫那到底是怎么回事？
‫为什么列表为零？
‫因为我们之前看到的名单是七个｡
‫好吧, 我知道了
‫那么, 为什么名单突然变成了零？
‫因为我们从来没有真正｡
‫我们看了一下名单, 删除了名单｡
‫好吧, 我知道了
‫我们所做的是删除列表中的一个元素｡
‫所以我们说List that remove｡
‫这是初学者的错误, 因为正如我之前告诉你的, 我们是通过引用传递的｡
‫我们不是按值传递｡
‫区别在于下面我们说的时候｡
‫我们要有一个清单｡
‫一旦调用了这个方法, 这里就是这样, 这里调用get party friends,
‫我们传递一个名为friends的列表｡
‫所以我们在这里传递这个列表, 这并不意味着我们传递了值,
‫我们实际上并没有传递对这些值的引用, 这意味着所有这些值, 它们都在我们内存的某个地方｡
‫所以它们它们在我们电脑的内存里｡
‫好吧, 我知道了
‫我们引用了这些价值观｡
‫所以我们说, 好吧, 我想去这个记忆, 你有你所有的朋友｡
‫所以我想去找弗兰克, 我想去找乔等等｡
‫例如, 一旦我们处理了这个列表, 我们就删除了列表中的一个元素｡
‫我们不创建一个包含这些值的副本, 然后我们继续从列表中删除元素｡
‫但我们实际上是在删除这个记忆｡
‫所以我们要把弗兰克从名单上删除, 把乔从名单上删除｡
‫所以你可以很容易地看到, 如果你在每个循环中使用这个来检查你的朋友｡
‫好的, 我再把它缩小一点, 这样我们就能看到一些东西了｡
‫所以我在每一个循环中都要检查一遍｡
‫如您所见, 只显示Angelina｡
‫为什么只有安吉丽娜？
‫因为安吉丽娜是名单上的第七个, 而我刚刚从名单上去掉了六个人｡
‫让我们再做一次四个人｡
‫让你看看玛丽亚卡洛斯和安吉丽娜还在那里｡
‫所以你看, 实际上, 是米歇尔｡
‫好吧, 我会的
‫更妙的是, 现在我们有一个非常奇怪的情况, 米歇尔, 卡洛斯和安吉丽娜仍然在名单上｡
‫因此, 我们不断地从列表中删除某人,
‫这会产生一系列问题, 因为如果其他人或如果我们在其他地方使用这个朋友列表, 那么它将是空的, 它将被破坏｡
‫这里没有初始值, 这是我们不应该做的.
‫所以我们可以在这里创建一个缓冲区｡
‫我将创建一个名为buffer的新变量, 它将是一个新的字符串列表｡
‫这是我的列表, 我现在要传递的是我的列表｡
‫好吧, 我会的
‫我会把它保存在缓冲区里｡
‫所以这将是一个新的名单｡
‫现在, 我们可以看到, 我们当然必须从缓冲区中移除｡
‫所以我们将从这份名单中删除｡
‫我们不会从列表中删除它本身｡
‫好吧, 我会的
‫这是我们必须做出的重要区分｡
‫我们正在从副本中删除｡
‫当然, 现在我们还得利用这里的缓冲地带把党赶到前线去｡
‫好吧, 我会的
‫因为否则我们将永远不会从名单上释放任何东西｡
‫永远都是七个人｡
‫因此, 即使在此缓冲区列表中, 也始终是七个人, 这样就无法正常工作｡
‫好吧, 我会的
‫所以我们是弗兰克, 乔, 米歇尔, 所有的东西都还在名单上｡
‫好吧, 我会的
‫因此, for each循环运行良好｡
‫相比之下, 我们可以做的是, 我们可以再做一个for循环, 然后和派对上的朋友们一起检查一下,
‫看看现在我们只有七个还是三个派对上的朋友｡
‫所以你可以看到这实际上是第四党的朋友｡
‫所以他们都在里面, 乔, 弗兰克和玛丽亚也还在里面｡
‫所以我们没有删除朋友列表, 我们删除了缓冲区列表中的元素｡
‫当然, 现在我们不再需要这个了｡
‫这只是为了测试和调试｡
‫但现在我们有了一个运行良好的程序｡
‫现在你可以说, 好吧, 我们不再有任何虫子了｡
‫但是我们还没有修正之前的一个错误, 如果我们在这里输入十｡
‫我们会的
‫遇到错误或错误？
‫实际上, 参数超出范围异常｡
‫那我们能做些什么呢？
‫因为我们试图访问的元素不存在｡
‫因此, 我们试图访问一个列表元素, 即使我们的列表是空的｡
‫所以列表计数为零｡
‫我们将在下一个视频中解决这个问题, 因为这个视频超过10分钟, 所以不想制作超长视频｡
‫我将在下一个视频中向大家展示如何解决这个问题, 因为我们有很多问题都是由此产生的｡
‫好吧, 我会的
‫所以让我们在下一个视频中解决它们｡
‫到时候见｡