java中如何抛出异常后继续运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何抛出异常后继续运行相关的知识,希望对你有一定的参考价值。

题目:输入若干个整数,并求和,直到结束标志999为止。在输入过程中,自动忽略掉输入的非整数。
代码:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Sum
static int i = 0;
static int s = 0;
static void sum() throws InputMismatchException
Scanner sc = new Scanner(System.in);
for(;;)
if(sc.hasNextInt())//如果输入流取到整数,则累加
int i=sc.nextInt();
if(i==999)//999为循环结束标志
break;
else
s+=i;

else//输入流取得非整数,则抛出异常
throw new InputMismatchException();// 如果不为整数,则抛出不匹配异常

sc.close();
System.out.println(s);


public static void main(String[] args)
try
sum();
catch (InputMismatchException e)
//i = 0;// 不匹配异常的处理,累加时忽略非整数
//System.out.println("输入了非整数");
catch (Exception e)
System.out.println("程序出现了其它异常");


出现InputMismatch后一直循环:
当某一扫描器抛出 InputMismatchException 时,该扫描器不会传递导致该异常的标记,因此可以通过其他某种方法来获取或跳过它。
这是java API文档中的原话。意思是说,如果nextInt方法没有成功解析出一个整数,那么你的输入不会被忽略。因为它或许能被其它格式解析。
那么你的程序中输入了a后,出现异常,number被赋值100,开始下一次循环,但这时数据缓冲区内你上次输入的a还在,并没有清除,这时继续解析a,还是错误,于是这个过程就一直重复下去了。
现在你要改的是,出现错误把这次的输入清除,只要在catch中,加一句:input.next()就搞定了!
也可以将Scanner写在try里面
参考技术A

结合前面的回答,我写了一下。sc.next()这句很重要,要不然会一直读那个错误的输入。

  //求输入的所有整数的和,当输入999时终止输入,并输出求和
  Scanner sc = new Scanner(System.in);
  //记录每一个整数的值
  int item = 0;
  //记录最后的求和
  int sum = 0;
  while(true) 
   try 
    item = sc.nextInt();
    if(item == 999) 
     break;
    
    catch(InputMismatchException e) 
    System.out.println("注意输入整数,请重新输入");
    //下面这句很重要。如果没有这句,缓冲区里一直会读错误的那个值,并且一直输出 上面所写的"注意输入整数,请重新输入"
    sc.next();
    continue;
   
   sum += item;
  
  
  System.out.println("sum:"+sum);

参考技术B 抛出异常后程序就中断了,不能继续执行,可以在trycatch(Exception e)finally
执行业务逻辑。只有这种在finally中谢代码 才可以把异常屏蔽掉
参考技术C java的异常处理机制,try···catch···finaly,继续运行的写在finaly里就好了。 参考技术D 将想要在异常抛出之后还要运行的代码部分放到finally里面

异常处理——Java的try catch用法

thread:线程
异常是一种处理机制,它提供一种可以检查程序中的错误,返回比较有好的界面。
异常不是编译时的错误,而是运行时的错误,只有运行时出错才能捕捉到。
可以将错误捕捉到然后继续执行余下的代码。程序继续执行

java程序处理异常的流程:
某个语句抛出异常后,会先将异常抛给目前的函数看有没有try catch语句捕获和处理异常,如果没有则返回上一层函数继续抛出异常看有没有try catch语句,如果也没有就抛给java的jre的jvm虚拟机,然后虚拟机给出一个粗暴的处理——程序停运行。
//当然如果没有异常则程序正常运行
try{
......
}
//捕捉到错误信息,e用来接收异常对象ArrayIndexOutOfBoundsException栈溢出
catch(ArithmeticException e){
e.printStackTrace();//可以理解为输出该异常的具体信息。
......
}
try catch对代码的优化并没有作用
异常只会从最近的try catch中输出一个,然后继续运行正常的代码。

常见的一些异常:
所有的异常都是Exception的子类。

以上是关于java中如何抛出异常后继续运行的主要内容,如果未能解决你的问题,请参考以下文章

Java:抛出异常后如何终止执行后面的代码?

java怎么处理异常让程序继续执行

抛出异常后如何继续执行java程序?

java抛出异常后程序还会不会往下执行?

java抛出异常thorw和throws的用法

Java中throw之后还会继续运行吗