当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,java就会用异常对象来描述。
Java中用2中方法处理异常:
1、在发生异常的地方直接处理;
2、将异常抛给调用者,让调用者处理;
异常分类:
1、检查性异常:java.lang.Exception,程序正确,是因为外在的环境条件不满足引发,例如:用户错误、I/O问题、网络端口、文件不存在等等;
2、运行期异常:java.lang.RuntimeException,程序存在bug,例如:数组越界,0被除,入参不满足规范......这类异常需要更改程序来避免,java编译器强制要求处理这类异常。
3、错误:java.lang.Error,一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。
顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类。
异常示例:
//打开文件 FileReader fr=new FileReader("d:\\aaa.txt"); //连接一个192.168.12.12,端口号4567 Socket s=new Socket("192.168.12.12",4567); //运行期异常 int a=4/0; //数组越界 int arr[]={1,2,3}; System.out.println(arr[123]);
异常处理
1、try...catch,程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
int x = (int) (Math.random() * 5); int y = (int) (Math.random() * 10); int z[] = new int[5]; try { System.out.println("y/x=" + (y / x)); System.out.println("y=" + y + "z[y]=" + z[y]); } catch (ArithmeticException exc1) { System.out.println("算术运算异常:" + exc1.getMessage()); } catch (ArrayIndexOutOfBoundsException exc2) { System.out.println("数组越界异常:" + exc2.getMessage()); }
2、finally,如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
FileReader fr = null; try { fr = new FileReader("d:\\aaa.txt"); } catch (Exception e) { e.printStackTrace(); } finally { if (fr != null) { try { fr.close(); } catch (Exception e) { e.printStackTrace(); } } }
以下情况finally块将不会被执行:
①finally块中发生了异常;
②程序所在线程死亡;
③在前面的代码中用了System.exit();
④关闭CPU;