java中的异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的异常相关的知识,希望对你有一定的参考价值。
Java中的异常 Exception
java.lang.Exception类是Java中所有异常的直接或间接父类。即Exception类是所有异常的根类。
例:
public class ExceptionTest
{
public static void main(String[] args)
{
int a = 3;
int b = 0;
int c = a / b;
System.out.println(c);
}
}
编译通过,执行时结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.learnjava.exception.ExceptionTest.main(ExceptionTest.java:9)
因为除数为0,所以引发了算数异常。
比较常见的异常还有:空指针异常,数组下标越界异常
java.lang.NullPointerException是空指针异常
java.lang.IndexOutOfBoundsException是下标越界异常
Java中的异常分为两大类:
1.Checked Exception(非Runtime Exception,编译时异常)
2.Unchecked Exception(Runtime Exception,运行时异常)
RuntimeException类是Exception类的子类,是运行时异常。Java中的所有运行时异常都会直接或者间接地继承RuntimeException类。
Java中凡是继承Exception,但又不继承RuntimeException类的异常都是非运行时异常。
异常处理的一般结构
try
{
// 可能发生异常的代码
// 如果发生了异常,那么异常之后的代码就不会被执行
}
catch (Exception e)
{
// 异常处理代码
}
finally
{
// 不管有没有发生异常,finally语句块都会被执行
}
比如开始的除法运算代码,加入异常处理之后:
public class ExceptionTest
{
public static void main(String[] args)
{
int c = 0;
try
{
int a = 3;
int b = 0;
c = a / b;// 这块代码出现了异常,那么异常之后的代码都不会被执行
System.out.println("没有发生异常");
}
catch (ArithmeticException e)
{
e.printStackTrace();
}
finally
{
//不管有没有发生异常,finally语句块都会被执行
System.out.println("finally语句!");
}
System.out.println(c);
// 当b为0时,有异常,输出为c的初始值0
}
}
多个catch
一个try后面可以跟多个catch,但不管多少个,最多只会有一个catch块被执行。
我们使用多个catch块来捕获异常时,需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。
如果异常类型是独立的,那么它们的前后顺序没有要求。
异常处理方法
对于非运行时异常(checked exception),必须要对其进行处理,否则无法通过编译。
处理方式有两种:
1.使用try..catch..finally进行捕获;
2.在产生异常的方法声明后面写上throws 某一个Exception类型,如throws Exception,将异常抛出到外面一层去。
对于try..catch..finally:
try和catch可以连用,try-catch-finally可以连用,但是try,catch,finally却不能单独使用,如果在程序中只想使用try而不想使用catch也可以,但是try的后面必须有finally。
自定义异常
所谓自定义异常,通常就是定义一个类,去继承Exception类或者它的子类。因为异常必须直接或者间接地继承Exception类。
通常情况下,会直接继承Exception类,一般不会继承某个运行时的异常类。
自定义异常举例:
public class MyException extends Exception
{
public MyException()
{
super();
}
public MyException(Exception e){
super(e);
}
public MyException(String message)
{
super(message);
}
}
注意:try块中有return语句时,仍然会首先执行finally块中的语句,然后方法再返回。
如果try块中存在System.exit(0);语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。
以上是关于java中的异常的主要内容,如果未能解决你的问题,请参考以下文章