java的异常可分为两大类:Checked Exception和Unchecked Exception(又名Runtime Exception)两者都继承自java.lang.Exception类
java中所有的异常都是一个类或者说是一个对象。
之所以分类是因为:系统对于这两大类的异常有不一样的处理方式。
java.lang.Throwable
java.lang.Exception
RuntimeException
……………………
java.lang.Error
Unchecked Exception(运行时异常):java中所有的运行时异常都直接或间接继承自RuntimeException类,
java对于运行时异常可以处理也可以不做任何处理,并建议最好不做处理。
处理异常与不处理的区别:如果对于异常不作处理(没有try……catch……),程序将不会继续往下执行
处理异常的方法:
public class Exception1
{
public static void main(String[] args)
{
int c = 99;
try
{
int a = 9;
int b = 0;
c = a / b; //会出现异常,即产生一个异常对象(new ArithmeticException())
System.out.println("after ArithmeticException");//不会被执行
} catch (ArithmeticException e)
{
e.printStackTrace();
System.out.println("catch block ");
}finally
{
System.out.println("finally block");//无论是否发生异常总会执行
}
System.out.println(c);//只有捕获了异常,才会执行
}
}
执行顺序:执行try代码块的语句,如果发生异常则产生一个相应的异常对象,执行catch语句,然后是finally语句,最后程序继续执行。 如果未发生异常,跳过catch块,执行finally语句,最后程序继续执行。
对于异常捕获也可以没有catch代码块,但不推荐不做任何的处理。也可以有多个catch块,但要注意异常之间的关系。
Checked Exception:对于非运行时异常必须对其进行处理,处理方式有两种:捕获处理和调用的方法处抛出
public class Exception1
{
public static void main(String[] args) //也可以在此处抛出异常
{
try
{ //捕获处理
int c = divide(12,3);
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static int divide(int a,int b) throws Exception
{
if(b == 0)
{
throw new Exception();
}
return a/b;
}
}
自定义异常:自定义异常一般继承自Exception类的子类。在开发中自定义的异常一般都继承Exception而非RuntimeException。
public class Exception1
{
public static void main(String[] args)
{
try
{
int c = divide(12,3);
} catch (MyException e)
{
e.printStackTrace();
}
}
public static int divide(int a,int b) throws MyException
{
if(b == 0)
{
throw new MyException("除数不能为0");
}
return a/b;
}
}
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
注意:如果在try代码块中有return语句,而语句未发生异常,则必须在执行完finally后才执行。
如果在try代码块中有System.exit(0)语句,则不会执行finally语句,因为System.exit(0)语句会终止当前的java虚拟机。