1.异常
异常 :不正常。
广泛意义上:程序中出现任何的不正常,一旦程序出现错误程序无法解决。
狭义上的异常:指程序运行时出现的不正常,但可以用异常处理机制解决。
异常的分类:
2.异常处理
① try{编写可能出现异常的代码}
catch(捕获异常类型){异常处理}
*可用Exception表示所有异常但不准确,当有多个异常时父类类型的异常必须放在catch的最下面
② finally: 发生异常时没有处理程序不能运行,但finally后的程序可以运行,即使出现异常,finally总会在返回前只执行。
public static void main(String[] args) { /* try { System.out.println(10/0); }catch (Exception e){ System.out.println("除数不能为0"); }finally { System.out.println("finally"); }*/ /*try { System.out.println(10/0);//发生异常 但是没有处理 程序不能继续向后执行, 但是finally中的代码可以执行 }finally { System.out.println("finally"); } System.out.println("后面代码");*/ System.out.println(Demo4.test()); } public static int test() { try { int a = 10; int b = 0; int c = a / b; return c; } catch (Exception e) { System.out.println("算术异常"); return -1; } finally {//即使出现异常,finally总会执行 System.out.println("最终执行的代码"); } }
③throws:抛出异常不处理,指声明方法可能出现异常但不会处理,交给方法调用时处理。
throws+UnsupportedEndingException (编译异常)提示方法调用的地方,在编译期间要做处理。
throws+NullPointerException(运行期异常)在编译期间不显示处理,运行后才显示。
方法重写:方法名相同,反回值相同,参数表相同,访问权限 修饰符大于或者等于父类的访问权限修饰符,声明异常的类型等于或者小于父类声明的异常类型。
public static void main(String[] args) { try { Demo5.test1(); } catch (UnsupportedEncodingException e) { System.out.println("编码格式不支持"); } } /* 声明test1() 可能会抛出异常 */ public static void test1() throws UnsupportedEncodingException { Demo5.test2(); } /* 模拟是一个偏底层方法,这样的一般不try{}catch(){} 继续声明此方法可能会出现异常, 作为方法的声明(定义) throws + UnsupportedEncodingException(编译期异常) 提示方法调用的地方,在编译期间就要做出处理 throws + NullPointerException(运行期异常) 在编译期间不显示的提示处理 */ public static void test2() throws UnsupportedEncodingException,NullPointerException { String s = "abc"; s.getBytes("utf-8"); System.out.println("aaaaaaaaaaaaaa"); }
④ throw: 在方法中显示抛出一个异常类的对象,表示此处发生了异常,new+有参构造方法,用来描述异常的原因,但方法会停止进行。
方法:e.printStackTrace在控制台打印异常的信息。
public static void main(String[] args) { try { trans(101); } catch (UnsupportedEncodingException e) { e.printStackTrace();//在控制台打印异常信息 开发测试期间使用 System.out.println(e.getMessage()); } } public static String trans(int socre) throws UnsupportedEncodingException {//不支持的编码异常UnsupportedEncodingException if(socre<0||socre>100){ /* throw 在方法中显示的抛出一个异常类的对象,表示此处实际发生了异常 new +有参的构造方法(描述异常原因) */ throw new UnsupportedEncodingException("非法分数"); } if(socre>=90){ return "A"; }else{ return "B"; } }
3.自定义异常
定义一个异常类必须继承异常
public class ScoreException extends Exception { public ScoreException(){ super(); } public ScoreException(String message){ super(message); } public static void main(String[] args) { try { trans(101); } catch (ScoreException e) { System.out.println(e.getMessage()); } } public static String trans(int socre) throws ScoreException { if(socre<0||socre>100){ /* throw 在方法中显示的抛出一个异常类的对象,表示此处实际发生了异常 new +有参的构造方法(描述异常原因) */ throw new ScoreException("非法分数"); } if(socre>=90){ return "A"; }else{ return "B"; } }