import java.util.Scanner;public class Exception1 { public static void main(String[] args){ /* * 异常处理 * 异常处理就是错误处理机制 * 是面向对象语言区别于面向过程语言的重要标志之一 * 异常处理机制的出现,可以使我们的程序更加强大而且安全 * */ Scanner in=new Scanner(System.in); System.out.println("请输入除数与被除数"); int a=in.nextInt(); int b=in.nextInt(); System.out.print("余数是->"+a%b); System.out.println("接下来要干的事"); /* * 当被除数是0的时候会抛出 * Exception in thread "main" java.lang.ArithmeticException: / by zero * at Exception.main(Exception.java:17)的异常 * 如果只是这个异常的话 ,用if语句来判断是否输入的为0即可 * 但是 往往异常比这复杂的多 * 当你键入的值 不是整数时候,用if是无法解决的 * 而程序也会中断执行 * 之后的代码将不会被执行 * 所有需要用异常处理机制来解决这个问题 * */ }}
控制台打出:
请输入除数与被除数
aa Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at java.util.Scanner.nextInt(Unknown Source) at java.util.Scanner.nextInt(Unknown Source) at Exception.main(Exception.java:15) 从这里可以看出 当输入的不是整数的时候 根本不允许你输入第二个。所以才有了异常处理机制
1:
用try...catch处理异常
它适合处理程序猿可以控制和用户输入有误的情况.
Scanner in=new Scanner(System.in); System.out.println("请输入除数与被除数"); try { int a=in.nextInt(); int b=in.nextInt(); System.out.print("余数是->"+a%b); } catch (Exception e) { // TODO: handle exception System.out.println("你的输入有误"); } System.out.println("接下来要干的事");
try里面的语句是可能出现问题的代码,catch里面的语句是出现问题之后要执行的代码。
这是控制台打出的
请输入除数与被除数
aa 你的输入有误 接下来要干的事这样就很好的处理了输入异常的问题.
2:
用Throws处理异常它的处理方法是将异常抛给上一级处理,如都不能处理
最终抛给虚拟机处理,这个过程我们称为抛异常 这中方法适合比较严重的异常和程序猿无法预料的异常
import java.util.Scanner;public class Exception2 { public static void main(String[] args){ //用Throws处理异常 /* * 它的处理方法是将异常抛给上一级处理,如都不能处理 * 最终抛给虚拟机处理,这个过程我们称为抛异常 * 这中方法适合比较严重的异常和程序猿无法预料的异常 * */ System.out.println("请输入除数与被除数"); A aa=new A(); try { aa.a(); } catch (Exception e) { // TODO: handle exception System.out.println("你的输入有误"); } System.out.println("接下来要干的事"); } }class A{ void a() throws Exception{ Scanner in=new Scanner(System.in); int a=in.nextInt(); int b=in.nextInt(); System.out.print("余数是->"+a%b); }}
这里在a()这里throws 如果a()里面出现异常它将抛给它的上级处理 它的上级在哪呢?
就是在主函数 因为你调用了 aa.a();
现在在主函数中处理这个异常
如果主函数中还处理不了 你就继续向上抛
import java.util.Scanner;public class Exception2 { public static void main(String[] args) throws Exception{ //用Throws处理异常 /* * 它的处理方法是将异常抛给上一级处理,如都不能处理 * 最终抛给虚拟机处理,这个过程我们称为抛异常 * 这中方法适合比较严重的异常和程序猿无法预料的异常 * */ System.out.println("请输入除数与被除数"); A aa=new A(); aa.a(); System.out.println("接下来要干的事"); }}class A{ void a() throws Exception{ Scanner in=new Scanner(System.in); int a=in.nextInt(); int b=in.nextInt(); System.out.print("余数是->"+a%b); }}
由于只有虚拟机能调用主函数,所以就将异常抛给了虚拟机,虚拟机能做的就是正常退出程序.
这就是2种处理异常的方法
最后讲一下 Finally
Finally语句是起到异常处理出口的作用
用在try...catch语句的最后,无论是否出现异常 Finally中的语句都会执行
import java.util.Scanner;public class Exception3 { public static void main(String[] args){ /* * Finally * Finally语句是起到异常处理出口的作用 * 用在try...catch语句的最后,无论是否出现异常 * Finally中的语句都会执行 * */ Scanner in=new Scanner(System.in); System.out.println("请输入除数与被除数"); try { int a=in.nextInt(); int b=in.nextInt(); System.out.print("余数是->"+a%b); } catch (Exception e) { // TODO: handle exception System.out.println("你的输入有误"); } finally{ System.out.println("接下来要干的事"); } /* * 现在看来finally可以不用写 * 但是往往 catch并不能处理全部异常 * 所以用finally能进行收尾工作 * 直观又好控制 * */ }}
现在看来finally可以不用写
但是往往 catch并不能处理全部异常 所以用finally能进行收尾工作 直观又好控制
关于Exception的种类,就自行百度,不做更多讲解。
异常处理的笔记就此结束.