您的位置:首页 > 编程语言 > Java开发

java异常处理

2015-12-27 18:30 453 查看

  Exception简介

       java异常(Exception)处理,今天就是我们讨论的话题,讨论一下,我们可以先想想一下,例如一个除法,我们肯定是要看他的被除数是不是为0,如果不是得话,程序就报错了,可能就停止运行了,然后弹出一些错误的信息,这就是我们今天要说的程序中的异常。

       为什么用

       那么什么事异常处理呢。就是说当我们的程序报错的时候,我们让系统创建一个错误的对象,然后将你的从发生的错误时创建的相应的对象创建出来,并且抛出来(Throw),让开发人员看到,当然这个方法你可以选择自己处理或者传递下去,但是他都会被Catch捕获到,当然出错的可能是你的环境,也可能是我们的代码不规范造成的。

       怎么用

       Java异常处理通过5个关键字控制:try、catch、throw、throws和 finally。下面讲述它们如何工作的。程序声明了你想要的异常监控包含在一个try块中。如果在try块中发生异常,它被抛出。你的代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系统产生的异常被Java运行时系统自动抛出。手动抛出一个异常,用关键字throw。任何被抛出方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码被放置在finally块中。

      下面是一个异常处理块的通常形式:

try {
// 写会发生运行错误的diamagnetic
}
catch (ExceptionType1 exOb) {
// 对ExceptionType1的处理程序
}
catch (ExceptionType2 exOb) {
//对 ExceptionType2的处理程序
}
// ...
finally {
// 执行最后的代码
}

      这里,ExceptionType 是发生异常的类型。下面将介绍怎样应用这个框架

     try...catch

       为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。完成这个任务很简单,下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try块和一个catch子句。

class ExcTest {
public static void main(String args[]) {
int d, a;
try {
d = 0;
a = 42 / d;
System.out.println("这将不会被打印.");
} catch (ArithmeticException e) { // 捕获除数为0的异常
System.out.println("除数是0.");
}
System.out.println("捕获之后的状态");
}
}


       注意在try块中的对println( )的调用是永远不会执行的。一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。因此,“这个讲不会被打印。”将不会被显示。一旦执行了catch语句,程序控制从整个try/catch机制的下面一行继续。

     当然一个异常处理可有多个catch.例如如下代码:

class MultiCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
} catch(ArithmeticException e) {
System.out.println("除数是 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("数组超出索引范围: " + e);
}
System.out.println("try/catch后的代码块.");
}
}
      不过要记住的一点是上边的catch的异常类型级别不能比下边的高,如果你上边写一个Exception ,他就会把上上边所有的错误都给你炮出来,这样的话,下边的就不会执行,这样你就很难找到你的错误在哪。

     一个try和它的catch语句形成了一个单元。catch子句的范围限制于try语句前面所定义的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。被try保护的语句声明必须在一个大括号之内(也就是说,它们必须在一个块中)。你不能单独使用try。

        构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。例如,下面的程序中,每一个for循环的反复得到两个随机整数。这两个整数分别被对方除,结果用来除12345。最后的结果存在a中。如果一个除法操作导致被零除错误,它将被捕获,a的值设为零,程序继续运行。

      throw

      到目前为止,你只是获取了被Java运行时系统抛出的异常。然而,程序可以用throw语句抛出明确的异常。Throw语句的通常形式如:throw ThrowableInstance;

      这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象。简单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常。但是程序在执行完throw之后会立即停止执行。

     throws

     如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常。做到这点你可以在方法声明中包含一个throws子句。一个 throws 子句列举了一个方法可能抛出的所有异常类型。这对于除Error或RuntimeException及它们子类以外类型的所有异常是必要的。一个方法可以抛出的所有其他类型的异常必须在throws子句中声明。如果不这样做,将会导致编译错误。

     下面是包含一个throws子句的方法声明的通用形式:
type method-name(parameter-list) throws exception-list{
// body of method
}
class ThrowsDemo {
static void throwOne() throws IllegalAccessException {
System.out.println("Inside throwOne.");
throw new IllegalAccessException("demo");
}

     finally

     当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向。依赖于方法是怎样编码的,异常甚至可以导致方法过早返回。这在一些方法中是一个问题。例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。finally关键字为处理这种意外而设计。
class FinallyDemo {

static void procA() {
try {
System.out.println("inside procA");
throw new RuntimeException("demo");
} finally {
System.out.println("A finally");
}
}

       为什么不用if else

       有人问我为什么不用if else,我只是说,如果你真的能保证你的代码没有一点问题,那么你可以不用,但是你能吗,我们不能保证我们能判断每一个参数的每一个条件。所以异常处理就再好不过了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异常处理