捕获异常后,如何继续执行Java程序?所以我做了一个程序,在双向链表的特定位置插入或删除节点。这两个方法抛出异常。在main方法中,我已经开始插入一些int值到位置。如果我输入了错误的位置值,插入方法会抛出一个错误并捕获块句柄。1.如果我已经输入了30个节点,并将它们插入到正确的位置,除了1个节点。-错误输入后(即在插入的中间),我如何继续插入其余的?第一个
jdzmm42g1#
您可以将myList.insert Package 在一个忽略Exception的方法中,并使用该方法:
myList.insert
static void insertAndIgnoreException(LinkedList list, int position, int value) { try { list.Insert(position, value); } catch (LinkedListInsertionException e) { System.out.println(e.getMessage()); } }
于是你的主要变成了:
public static void main(String[] args) { LinkedList myList = new LinkedList(); insertAndIgnoreException(1, 0); insertAndIgnoreException(5, 54); // this is the false entry insertAndIgnoreException(1, 0); insertAndIgnoreException(1, 0); myList.Out(); myList.ReverseOutput(); }
一些注意事项:1.我已经使用了一个特定的异常类型LinkedListInsertionException。* 永远不要 * 捕捉和忽略Exception,因为你最终会错过所有其他类型的问题,例如NullPointerException s。1.在代码中坚持Java命名约定,即insert而不是Insert。1.不要重复使用JDK类名,即使用MyLinkedList而不是LinkedList。
LinkedListInsertionException
Exception
NullPointerException
insert
Insert
MyLinkedList
LinkedList
63lcw9qa2#
在本例中,您可以使用loop来解决此问题。类似于:
int[] numsToInsert = new int[] {1, 0, 5, 54, 1, 0, 1, 0}; for(int i = 0; i < 8; i += 2){ try { myList.Insert(numsToInsert[i], numsToInsert[i + 1]); } catch (Exception ex) { System.out.println(ex.toString()); } }
这将通过迭代地执行插入来分别捕获每个插入的异常。
rt4zxlrg3#
简短的回答是:你不知道。......但这并不意味着你无能为力。try/catch的目的是一旦检测到错误就停止所有的处理。它的目的是跳过代码的其余部分(一直到catch)。它做的正是它应该做的,这与说“跳过我”是一样的。因此,您的问题“我如何运行其余代码”只能通过从“跳过我”指令中删除代码来实现。
try { myList.Insert(1, 0); myList.Insert(5, 54); // this is the false entry } catch (Exception ex) { System.out.println(ex.toString()); } myList.Insert(1, 0); myList.Insert(1, 0); myList.Out(); myList.ReverseOutput();
这将给予您提供所需的输出。......但感觉不太对如果我们要从try中删除代码,看起来try似乎不值得。问题是,try块被放在那里是出于某种原因。Try块应该捕捉错误,它成功地做到了这一点,所以很明显它做了一些有用的事情,从它中删除代码感觉是错误的解决方案。我们需要的是尝试 * 每一行代码 *,如果失败,尝试下一行。注意,我不止一次地说try,还有“每一”
try
try { myList.Insert(1, 0); } catch (Exception ex) { System.out.println(ex.toString()); } try { myList.Insert(5, 54); // this is the false entry } catch (Exception ex) { System.out.println(ex.toString()); } try { myList.Insert(1, 0); } catch (Exception ex) { System.out.println(ex.toString()); } try { myList.Insert(1, 0); } catch (Exception ex) { System.out.println(ex.toString()); }
这也会给予你你想要的输出,也会处理任何那些踢出错误的插入。......但感觉不太对这是一个重复的文本很多,只是做同样的插入一遍又一遍。如果我们有一个方法来重复的东西?
int values[4][2] = { {1,0}, {5,54}, {1,0}, {1,0} }; for(int v[2] : values){ try { myList.Insert(v[0], v[1]); } catch (Exception ex) { System.out.println(ex.toString()); } }
这将给予你想要的输出,处理任何踢出错误的插入,并避免不断的重复。......但感觉不太对原始代码没有使用循环。我认为这是有原因的:它可能是一个最终将从其他地方接收值的测试存根。这表明让每一项都独立测试是 * 这段代码的实际目的 *。如果是这样,我们有一种方法可以让这一行代码处理它自己的错误:
function TryInsert(list,pos,val){ try { list.Insert(pos, val); return true; } catch (Exception ex) { System.out.println(ex.toString()); return false; } } ... TryInsert(mylist, 1, 0); TryInsert(mylist, 5, 54); // this is the false entry TryInsert(mylist, 1, 0); TryInsert(mylist, 1, 0);
这将给予您想要的输出,处理任何踢出错误的插入,并且更符合原始意图。......但感觉不太对假设你在每个函数调用中都传递了myList对象,看起来这个对象就是要被操作的对象,这表明这是你的Insert函数真正想要的行为。也许您希望修改类,或者向类中添加此函数,或者修改Insert,以便在发生错误时根据自己的最佳判断来操作(直接或通过继承)。
myList
myList.TryInsert(1, 0); myList.TryInsert(5, 54); // this is the false entry myList.TryInsert(1, 0); myList.TryInsert(1, 0);
鉴于我无法访问您的类......我把它作为练习留给读者。
重构很有趣
3条答案
按热度按时间jdzmm42g1#
您可以将
myList.insert
Package 在一个忽略Exception的方法中,并使用该方法:于是你的主要变成了:
一些注意事项:
1.我已经使用了一个特定的异常类型
LinkedListInsertionException
。* 永远不要 * 捕捉和忽略Exception
,因为你最终会错过所有其他类型的问题,例如NullPointerException
s。1.在代码中坚持Java命名约定,即
insert
而不是Insert
。1.不要重复使用JDK类名,即使用
MyLinkedList
而不是LinkedList
。63lcw9qa2#
在本例中,您可以使用loop来解决此问题。
类似于:
这将通过迭代地执行插入来分别捕获每个插入的异常。
rt4zxlrg3#
简短的回答是:你不知道。
......但这并不意味着你无能为力。
try/catch的目的是一旦检测到错误就停止所有的处理。它的目的是跳过代码的其余部分(一直到catch)。它做的正是它应该做的,这与说“跳过我”是一样的。
因此,您的问题“我如何运行其余代码”只能通过从“跳过我”指令中删除代码来实现。
这将给予您提供所需的输出。
......但感觉不太对
如果我们要从
try
中删除代码,看起来try似乎不值得。问题是,try块被放在那里是出于某种原因。Try块应该捕捉错误,它成功地做到了这一点,所以很明显它做了一些有用的事情,从它中删除代码感觉是错误的解决方案。我们需要的是尝试 * 每一行代码 *,如果失败,尝试下一行。注意,我不止一次地说
try
,还有“每一”这也会给予你你想要的输出,也会处理任何那些踢出错误的插入。
......但感觉不太对
这是一个重复的文本很多,只是做同样的插入一遍又一遍。如果我们有一个方法来重复的东西?
这将给予你想要的输出,处理任何踢出错误的插入,并避免不断的重复。
......但感觉不太对
原始代码没有使用循环。我认为这是有原因的:它可能是一个最终将从其他地方接收值的测试存根。
这表明让每一项都独立测试是 * 这段代码的实际目的 *。如果是这样,我们有一种方法可以让这一行代码处理它自己的错误:
这将给予您想要的输出,处理任何踢出错误的插入,并且更符合原始意图。
......但感觉不太对
假设你在每个函数调用中都传递了
myList
对象,看起来这个对象就是要被操作的对象,这表明这是你的Insert
函数真正想要的行为。也许您希望修改类,或者向类中添加此函数,或者修改
Insert
,以便在发生错误时根据自己的最佳判断来操作(直接或通过继承)。鉴于我无法访问您的类......我把它作为练习留给读者。
重构很有趣