异常
- Error:从技术上讲,Error及其子类对象不是异常,它们代表了程序运行时Java系统内部的错误,与程序设计者无关,并且Error是不可查的。
- Exception:通常是由于某个资源不可用,或者正确执行程序所需的条件不满足所造成的,是程序本身可以处理的异常。
异常处理的方式
-
try-catch-finally语句:它的做法是将可能出错的代码放到try语句块中去尝试是否能顺利执行,异常代码放在catch语句块里,捕获并处理异常。而finally里面的语句则是不管是否有异常都会执行的。try语句抛出异常时才会执行catch语句。
package com.sw.t2; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) { FileWriter fw = null; String str = "123456"; try { //try语句里面的两语句可能出现抛出异常,所有把它们放在try语句里; //查API可知道FileWriter(File file)方法是这样的 //public FileWriter(File file) //throws IOException //像这种明显的抛出异常的方法是一定要对异常进行处理的 fw = new FileWriter("hello.txt"); fw.write(str,0,str.length()); } catch (IOException e) { e.printStackTrace(); }finally {//不管有无抛出异常都会执行 if (fw != null) { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
异常的处理在程序的运行中是很重要的。如果不处理的话可能会导致整个程序都停止
package com.sw.t2; public class Test { public static void main(String[] args) { int a = 10; int b = 0; int res = 0; res = a/b;//因为b=0一个数来除0,会抛出异常 //Exception in thread "main" java.lang.ArithmeticException: / by zero //如果不进行处理的话后面的代码就不会运行了。 System.out.println("123"); } }
package com.sw.t2; public class Test { public static void main(String[] args) { int a = 10; int b = 0; int res = 0; try {//使用try-catch-finally语句来处理异常通过处理后,后面的代码还能继续运行。 res = a/b; }catch (Exception e){ e.printStackTrace(); //System.out.println("123"); } System.out.println("123");//这个语句也可以放到finally语句中 //或者catch里面也都是能被执行的 } } //运行结果 /*java.lang.ArithmeticException: / by zero at com.sw.t2.Test.main(Test.java:9) 123*/
-
抛出异常:如果当前方法不知道如何处理捕获的异常,可以用throws将此异常再次抛出,交给当前方法的上一层调用者,如果上一层调用者还不知道怎么处理,也可以继续上抛,直到被某方法处理或者交给JVM,最后终止程序。
-
throws语句:用在声明方法时表示,该方法可能抛出异常,调用者必须进行处理,捕捉或者继续上抛。在上抛的时候需要注意子类方法可以:
-
抛出与父类方法相同的异常
-
抛出父类方法抛出的异常的子类
-
不抛出异常
-
-
throw语句:用户自定义的异常必须自行抛出,自行抛出异常就要使用throw语句,它抛出的不是异常类,而是异常对象。一旦执行throw语句,它后面的代码都不会被执行
package com.sw.t2; //自定义一个名为MyException的异常 public class MyException extends Exception{ public MyException() {} public MyException(String msg) { super(msg); } }
package com.sw.t2_1; import com.sw.t2.MyException; public class Test { public void run() throws MyException {//写一个方法它可能会 //抛出MyException这一异常 throw new MyException("123");//使用throw语句自行抛出异常 } public static void main(String[] args) { Test t = new Test(); try { t.run(); } catch (MyException e) { e.printStackTrace(); } } }
-