java 捕获try-catch块中的错误后继续执行

dnph8jn4  于 2022-11-27  发布在  Java
关注(0)|答案(3)|浏览(250)

捕获异常后,如何继续执行Java程序?
所以我做了一个程序,在双向链表的特定位置插入或删除节点。这两个方法抛出异常。
在main方法中,我已经开始插入一些int值到位置。如果我输入了错误的位置值,插入方法会抛出一个错误并捕获块句柄。
1.如果我已经输入了30个节点,并将它们插入到正确的位置,除了1个节点。-错误输入后(即在插入的中间),我如何继续插入其余的?
第一个

jdzmm42g

jdzmm42g1#

您可以将myList.insert Package 在一个忽略Exception的方法中,并使用该方法:

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

63lcw9qa

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());
    }
}

这将通过迭代地执行插入来分别捕获每个插入的异常。

rt4zxlrg

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 {
            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.TryInsert(1, 0);
myList.TryInsert(5, 54); //  this is the false entry
myList.TryInsert(1, 0);
myList.TryInsert(1, 0);

鉴于我无法访问您的类......我把它作为练习留给读者。

重构很有趣

相关问题