Java的异常处理 1.生活小事:今天休假,我骑电瓶车去镇上网吧上网。 问题1:走了一半,道路施工,路面重整 ,无法通过。 严重问题:不是我自身问题,我没法解决 问题2:刚插钥匙,电量不足啊,昨晚忘记充电了。 出发前就该检查的问题,我自身的问题 问题3:妈的,骑田沟里去了。 行进中的事故问题,不一定是我自身的问题 程序:也会碰到上述三类问题(不正常即异常) Throwable类是Java所有异常的超类; 严重问题:Error(它有很多子类,这类异常我们不处理,我们也处理不了) 普通问题:Exception(它也有很多子类 ,又分为两类 A、B) A.对应问题3,运行时异常RuntimeException;(这个我们也不处理,出现了,说明代码不严谨,修改 ) B.非RuntimeException,编译时异常;(这是我们要处理的异常) 如果程序出现异常我们不做处理,JVM会做默认的处理(method1): 把异常的名称、原因及出现的位置等信息输出到控制台上,同时结束程序 2.处理异常的语法(method2) A.try...catch...finally try{ 可能出现问题的代码 }catch(异常名 变量){ 针对问题的处理 }finally{ 释放资源 } 或变形格式: try{ 可能出现问题的代码 }catch(异常名 变量){ 针对问题的处理 } B.throws 抛出 注意点:try里面的代码越少越好;catch里面 必须有内容(没有等于忽略了异常) 3.两个异常的处理 A.每一个写一个try...catch(method3) B.写一个try多个catch 注意点: 能明确的尽量明确,不要用大的父类来处理; 平级关系的异常无先后顺序,如果出现父子关系,则父在后(method5)。这是因为: 一旦try里出现问题,它就会将问题抛出,与catch里的异常依次匹配,一旦匹配上,就执行catch里的处理,然后直接结束 try...catch,继续执行后面的代码(method4) 4.JDK7出现了一个新的异常处理方案,用来处理多个异常(method6) try{ 可能出现问题的代码 }catch(异常名1|异常名2...变量){ 针对问题的处理 } A.这几类异常的处理方式是一致的(实际开发中,可能就是针对几种异常,给出同一种处理 B.多个异常间必须是平级关系
package knowledge_basic_02;
public class ExceptionDemo {
//以下例子虽然处理的是RuntimeException,但同样有演示的效果
//JVM默认的异常处理方式 (异常位置后不会被执行了)
public static void method1()
{
int a=100;
int b=0;
System.out.println(a/b);
System.out.println("over");
}
//一个异常处理
public static void method2()
{
int a=100;
int b=0;
try{
System.out.println(a/b);
}catch(ArithmeticException ae){
System.out.println("除数不能为 0!");
}
System.out.println("over");
}
//两个异常处理方式 1:每个异常一个try...catch
public static void method3()
{
int a=100;
int b=0;
try{
System.out.println(a/b);
}catch(ArithmeticException ae){
System.out.println("除数不能为 0!");
}
int[] arr=new int[]{1,3,5,7};
try{
System.out.println(arr[4]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("访问了不存在的数组索引!");
}
System.out.println("over");
}
//两个异常处理方式 2:一个try多个catch
public static void method4()
{
int a=100;
int b=0;
int[] arr=new int[]{1,3,5,7};
try{
System.out.println(a/b);
System.out.println(arr[4]);
}catch(ArithmeticException ae){
System.out.println("除数不能为 0!");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("访问了不存在的数组索引!");
}
System.out.println("over");
}
//父异常必须在后面,否则会出错
public static void method5()
{
int a=100;
int b=0;
int[] arr=new int[]{1,3,5,7};
try{
System.out.println(a/b);
System.out.println(arr[4]);
System.out.println("不太清楚的异常");
}catch(ArithmeticException ae){
System.out.println("除数不能为 0!");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("访问了不存在的数组索引!");
}catch(Exception e){
System.out.println("出问题了!");
}
System.out.println("over");
}
//JDK7新的处理多个异常的方式
public static void method6()
{
int a=100;
int b=0;
int[] arr=new int[]{1,3,5,7};
try{
System.out.println(a/b);
System.out.println(arr[4]);
}catch(ArithmeticException|ArrayIndexOutOfBoundsException e){
System.out.println("出现问题了!");
}
System.out.println("over");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//method1();
//method2();
//method3();
//method4();
//method5();
method6();
}
}
method1()结果:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at knowledge_basic_02.ExceptionDemo.method1(ExceptionDemo.java:10)
at knowledge_basic_02.ExceptionDemo.main(ExceptionDemo.java:16)
method2()结果:
除数不能为 0!
over
method3()结果:
除数不能为 0!
访问了不存在的数组索引!
over
method4()结果:
除数不能为 0!
over
method5()结果:
除数不能为 0!
over
method6()结果:
出现问题了!
over