问题描述
我知道并认识到(或我认为是这样),通过try{}catch
块和通过类或方法抛出异常来区别beetwen异常,但是我想知道是否有办法通过方法使用throws
kayword并确保执行异常后此代码/方法的内容?
我的意思是,例如下面的示例:
public class Main {
int[] array = {0,1,2};
public static void main(String[] args){
Main object = new Main();
System.out.println("Dealing inside try{}catch block");
object.dealInside();
System.out.println("Dealing by throws keyword");
try{
object.throwOutside();
}catch (ArrayIndexOutOfBoundsException ex){
}
}
public void dealInside(){
for(int i = 0; i < 6; i++){
try{
System.out.println(i);
int r = array[i];
}catch (ArrayIndexOutOfBoundsException ex){
}
}
}
public void throwOutside() throws ArrayIndexOutOfBoundsException{
for(int i = 0; i < 6; i++){
System.out.println(i);
int r = array[i];
}
}
}
如果循环中有try{}catch
块,则即使发生异常,方法也可以继续执行,即使数组的长度为3,它也可以打印int直到6。但是如果方法throws
异常,则一旦被中断的方法停止。
-
有没有一种方法可以继续工作,从而
throws
异常? -
是否可以同时处理
throws
相似/相同异常的多个方法,而又不中断其执行?
1楼
finally
这是finally
块的确切目的。
要在其中执行代码,无论是否在其之前捕获到异常。
它将始终执行。
编写一些逻辑,通过更改finally块中的i的值来实现您真正想要的。
try {
//risky code
} catch(Exception ex) {
//handle caught exception
} finally {
//this part always executes
}
现在,有点棘手。 如果您确实希望for循环继续进行,即使在后续语句中捕获到异常,也可以执行此操作。
for(int i = 0; i < 6; i++) {
Thread t = new Thread(new Runnable() {
void run() {
try{
System.out.println(i);
int r = array[i];
}catch (ArrayIndexOutOfBoundsException ex){
}
});
t.start();
}
for loop
在有风险的代码位于单独的线程中时在主thread
上运行。
因此,即使遇到异常,主线程仍会继续运行,因为它对抛出的异常一无所知。
这是一个巧妙的把戏。
但是我不知道在实践中使用它是否是一个好主意。