在程序开发中,可能存在各种错误,有些错误是可以避免的,而有些错误却是意想不到的,在Java中把这些可能发生的错误称为异常。
Throwable类是所有异常类的超类,该类的两个直接子类是Error和Exception。其中Error及其子类用于指示合理的应用程序不应该试图捕获的严重问题,Exception及其子类给出了合理的应用程序需要捕获的异常。
处理异常:
1.使用try....catch处理异常
try{ 需要正常执行的语句 } catch(Exception ex){ 对异常进行处理的语句 }
try和catch是进行异常处理的关键字。
try后面的花括号里的内容是程序需要正常执行但是又可能发生异常的语句。
catch的小括号内是程序需要处理的异常类型。
catch的花括号内是对程序发生的异常进行处理的语句。
2.使用try...catch...finally处理异常
try{ 需要正常执行的语句 } catch(Exception ex){ 对异常进行处理的语句 } finally{ 一定会被处理的语句 }
try和catch是进行异常处理的关键字。
try后面的花括号里的内容是程序需要正常执行但是又可能发生异常的语句。
catch的小括号内是程序需要处理的异常类型。
catch的花括号内是对程序发生的异常进行处理的语句。
finally后的语句,不管程序是否发生异常都要执行,也就是说,程序执行完try的语句或者执行完catch语句都要执行finally语句,因此finally语句块通常用于执行垃圾回收、释放资源等操作。
3.使用try...finally处理异常
try{ 需要正常执行的语句 } finally{ 一定会被处理的语句 }
try和finally是进行异常处理的关键字。
try和finally之间的两个大括号内是程序需要正常执行但又可能发生异常的语句。
finally后两个大括号内的语句是不管程序是否发生异常最终都要执行的语句。因此finally语句块通常用于放置程序中必须执行的代码。
抛出异常:
对于程序中发生的异常,除了可以使用try...catch语句块处理之外,还可以使用throws声明throw语句抛出异常。
格式如下:
public static double Test() throws Exception{}
下面举个栗子:
public static void main(String[] args) throws Exception { System.out.println("请输入一个数字"); int s = 0; try{ Scanner sc = new Scanner(System.in); String i = sc.nextLine(); s = Integer.parseInt(i); } catch(Exception e){ System.out.println(e.getMessage()); Exception ex = new Exception(); throw new Exception(ex); } double a =0; try{ a = 100/s; System.out.println(a); } catch(Exception e){ System.out.println(e.getMessage()); } }
输出为:
请输入一个数字 asdasd For input string: "asdasd" Exception in thread "main" java.lang.Exception: java.lang.Exception at com.yichang.Test.main(Test.java:43) Caused by: java.lang.Exception at com.yichang.Test.main(Test.java:42)
带有throws Exception的方法:
1.里面的异常可以免去try...catch
2.调这个方法的代码,必须要被try...catch(当然也可以再抛出)。
再来个例子:
public static double Test() throws Exception{ System.out.println("请输入一个数"); double a =0; try{ Scanner sc = new Scanner(System.in); String i = sc.nextLine(); int s =Integer.parseInt(i); a =100/s; } catch(Exception e){ throw new MyException(); } return a; } public static void main(String[] args) throws Exception{ try { double d = Test(); System.out.println(d); } catch (MyException e) { // TODO 自动生成的 catch 块 System.out.println(e.get()); } }
public class MyException extends Exception { public String get(){ return "hahahahahhahahaha"; } }
输出错误时为:
请输入一个数
asdasd
hahahahahhahahaha