/*
在Java程序的执行过程中,如果出现了异常事件,就会生成一个例外对象。
java中的例外类可分为两大类:
Error:
动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类例外,也不会抛弃这种例外。
Exception:
1)运行时例外:
继承于RuntimeException的类都属于运行时例外,
由于这些例外产生的位置是未知的,Java 编译器允许程序员在程序中不对它们做出处理.
2)非运行时例外:
除了运行时例外之外的其他由Exception 继承来的例外类都是非运行时的例外,
Java编译器要求在程序中必须处理这种例外.
两种处理例外的机制:
捕获例外:
简言之,就是try-catch语句.
声明抛弃例外:
如果一个方法并不知道如何处理所出现的例外,则可在方法声明时,
声明抛弃(throws)例外。这是一种消极的例外处理机制。
简言之,就是在方法前加throws Xxx.
例外类的层次见HELP
try-catch-finally:
try{
......
}catch( ExceptionName1 e ){//没一个catch语句称为一个异常处理器
......
}catch( ExceptionName2 e ){
......
}
......
}finally{
......
}
在执行try语句块期间的任何时刻抛出异常是,如果存在相应的异常处理器,程序控制会立即转到它
上面。就是说,程序控制会转到其异常类与所抛出的异常类对应的第一个catch句子上。执行完catch
子句后,程序控制会转到整个try语句后的语句
finally语句必须在catch 子句后面
try必须, catch和fianlly可选。
*/
//Programme 1:
public class TestException
{
public static void main(String[] args)
{
//处理例外机制1:捕获例外
try
{
int a=0, b=0;
a /=b;
}
/*在catch块中是对例外对象进行处理的代码,与访问其它对象一样,
可以访问一个例外对象的变量或调用它的方法。getMessage( )是类
Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable
还提供了方法printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容
*/
/*捕获例外的顺序和catch语句的顺序有关,当捕获到一个例外时,
剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,
首先应该捕获最特殊的例外,然后再逐渐一般化。也就是一般先安排子类,
再安排父类。
*/
catch (ArithmeticException e)
{
e.printStackTrace(System.out);
}
/*当捕获到一个例外时,剩下的catch语句就不再进行匹配,
所以下面的catch语句不执行
*/
catch(RuntimeException e)
{
System.out.println(e.getMessage());
}
}
}
/*result:
java.lang.ArithmeticException: / by zero
at TestException.main(TestException.java:9)
*/
//Programme 2:
class Test
{
public int devide(int x, int y) throws DevideByMinusException/*处理例外机制2:抛出例外.
声明抛弃例外是在一个方法声明中的throws子句中指明的.
throws子句中同时可以指明多个例外,之间由逗号隔开。
此处的DevideByMinusException也可以改成其父类
Exception,没有影响.*/
{
if (y < 0)
/*抛出例外就是产生例外对象的过程,首先要生成例外对象,例外或者由虚拟机生成,
或者由某些类的实例生成,也可以在程序中生成。在方法中,抛出例外对象通过throw语句实现。*/
throw new DevideByMinusException ("cannot devided by minus");
int result = x/y;
return result;
}
}
class DevideByMinusException extends Exception//自定义例外类必须是Throwable的直接或间接子类。
{
public DevideByMinusException(String msg)
{
super(msg);
}
}
class TestException
{
public static void main(String[] args)
{
Test test = new Test();
//方法的调用者必须了解这些例外,并确定如何正确的处理他们。
try
{
test.devide(3, -1);
}
catch (Exception e)
{
System.out.println (e.getMessage());
}
System.out.println ("Programme is running here!");
}
}
/*result:
cannot devided by minus
Programme is running here!
*/
评论