异常的基本概念
异常是导致程序中断运行的一种指令流。如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序的正常执行。
为什么要处理异常
一旦异常产生之后,异常之后的语句并不会执行,而是直接结束程序,并将错误报告给用户。
一个简单的异常如以下代码:
public class ExceptionDemo01
{
public static void main(String args[]){
int a=3;
int b=0;
int c=a/b; //此处会出现异常 0不能为除数
System.out.println(c);
//程序输出
//Exception in thread "main" java.lang.ArithmeticException: / by zero
// at ExceptionDemo01.main(ExceptionDemo01.java:6)
}
}
处理异常
如果要处理异常,则必须遵循以下格式:
try{
//有肯能出现异常的语句
}catch(异常类 异常对象){
//编写异常的处理语句
}catch(异常类 异常对象){
//编写异常的处理语句
}...
finally{
//不管会不会有异常,肯定会执行的代码
}
经过处理异常后的代码:
public class ExceptionDemo02
{
public static void main(String args[]){
int a=3;
int b=0;
try{
int c=a/b;
}
catch(ArithmeticException e){
System.out.println("出现算数异常!");
}
finally{
System.out.println("肯定会执行的代码段");
}
}
}
以上代码通过try{ }catch()finally{}代码块对异常进行了处理。
如果现在程序存在多个异常,从文档中可以发现,所有的异常类都继承自Exception类,它是所有异常类的父类,那么如果现在有多个异常存在,则可以使用Exception
public class ExceptionDemo03
{
public static void main(String args[]){
int a=3;
int b=0;
int c[]=new int[3];
try{
int d=a/b; //会出现算数的异常
c[4]=0; //会出现数组越界异常
}
catch(Exception e){ //使用Exception进行异常捕捉
e.getStackTrace();
}
finally{
System.out.println("肯定会执行的代码段");
}
}
}
异常类的继承结构
在整个java的异常结构中,实际上有以下两个最常用的类:Excption、Error,这两个类都是Thorwable的子类。
Exception:一般表示的是程序出现的问题,可以直接使用try..catch进行处理。
Error:一般指的是JVM错误,程序中无法处理。
一般情况下开发者都比较习惯于将Error和Excption统一称为异常,而之前所处理的异常,都是Exception的子类。
注意:一般在输出异常信息的时候,可以直接使用System.out.println()打印异常对象。
也可以通过Exception提供的一个方法,public void printStackTrace();
Java的异常处理机制
在整个java的异常处理中,实际上也是按照面向对象的方式进行处理,步骤如下:
1、 一旦异常产生,则首先会产生一个异常的实例化对象;
2、 在try语句中对此异常对象进行捕捉;
3、 产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码。
异常的其它概念
throws关键字
在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理。
throws使用格式:
·public 返回值类型 方法名称(参数列表…) throws 异常类{};
使用throws声明的方法:
public class ExceptionDemo04
{
public static int div(int a,int b) throws Exception{ //使用throws关键字声明方法
return a/b;
}
public static void main(String args[]){
//在调用有异常抛出的方法就必须进行异常处理
try{
System.out.println(div(3,0));
}catch(Exception e){
e.getStackTrace();
}
}
}
throw关键字
与throws不相同的是,可以直接使用throw抛出一个异常。抛出的时候直接抛出异常类的实例化对象即可。
public class ExceptionDemo05
{
public static void main(String args[]){
try{
throw new Exception("自己new的异常对象"); //抛出异常的实例化对象
}catch(Exception e){
System.out.println(e);
}
}
}
Exception与RuntimeException的区别
这两个类的区别如下:
·Exception在程序中是必须用try…catch进行处理的。
·RuntimeException可以不使用try…catch进行处理,但是如果有异常产生吗,则交给JVM。
public class ExceptionDemo06
{
public static void main(String args[]){
String str="123"; //定义全部由数字组成的字符串
Integer a=Integer.parseInt(str); //将字符串转为int
System.out.println(a);
}
}
以上的程序执行是正常的,但是包装类Integer类的parseInt的定义格式如下:
public static int parseInt(String s) throws NumberFormatException
NumbetFormatExcepion父类是RuntimeException,则由此说明程序抛出TuntimeException的异常可以不进行处理,由JVM进行处理