我们写程序的时候,经常会遇到各种错误的发生,汇总起来大概有两种;
·语法错误——拼写错误
·逻辑错误——数组下标越界、除数为0.
语法错误可以有编译器调试的出,所以容易解决;但是逻辑错误就不能这么轻松的得出问题所在,所以我们对这类错误要进行管理。
为了解决这类问题,一般有两种办法:
·使用if语句,把各种问题导致的故障考虑在里面。但是使用if语句要把所有的情况都考虑在内,思维繁琐困难,而且这种情况下异常情况的处理与原程序混杂在一起,干扰了人们实现程序的功能。
·异常处理类和异常处理机制。这种情况下我们可以把关注点集中到程序功能上面去,异常处理单独提出来,在另外的地方实现。
异常处理就是将接受和处理错误的代码分开。程序员可以着眼于功能的实现而 不用纠结于异常的处理。这样就增强了程序的可读性,有利于程序的阅读和理解。
计算机对异常的处理通常有两种情况:
(1)计算机自动检测及处理异常。
(2)人工加入异常处理程序。
Java语言采用面向对象的异常处理机制。通过异常处理机制,可以预防错误所造成的影响,并能够及时处理。Java系统的异常处理机制主要包括两个步骤:
(1)捕获异常
(2)处理异常
对于可能的出现的错误情况,Java使用“异常处理机制”来预防、捕获并处理这些异常。
1.异常类
Java中所有的异常情况都被定义为某一类的异常对象。
Java中所有的异常类都是Throwable类的子类或者子类派生而来,Throwable类定义在java.lang包中,。这就说明他们具有某些相同的属性和方法,在使用上也有一定的相似性。
Throwable类有两个重要的子类:Exception类和Error类。Exception类是所有异常类的直接父类,Error类是所有错误类型类的直接父类。
2.异常处理
Java语言的异常处理主要有:
(1)try-catch-finally语句.
(2)throw语句.
(3)throws语句.
2.1try-catch-finally
语法规则如下:
try
{
//可能出现异常的代码
}
catch(异常类型1 异常名1)
{
//处理异常的程序代码
}
catch(异常类型2 异常名2)
{
//处理异常的程序代码
}
······
finally
{
//前面无法处理的异常,在这里解决
}
将源程序代码放在try块中,运行时监控检查try块中的程序代码,如果有异常出现,将会抛出一个或者多个异常。所以在try后面可跟一个或者多个catch。如果有多个catch块,一般异常处理放那额日较小的在前面,异常包含范围较大的在后面。
如果try块中没有出现异常,那么所有与当前try块相关的catch块都会被忽略,程序继续执行try-cathc结构后面的语句。
如果try块中出现了异常,异常出现语句后面的语句将被忽略,程序转向cathc异常处理结构中,有catch捕获并处理 异常。
如果catch块后面有finally块,则不管有没有异常发生、catch块是否执行都会执行finally块。finally块可选,一般用来进行程序管理,如一些释放资源、关闭文件等操作。
示例:
public class Example04 {
/**
* 异常处理
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=1,b=0;
try
{
System.out.println(a/b); //可能出现异常的代码
}
catch(ArithmeticException e) //异常类型 异常名
{
System.out.println("除数不能为0!");//处理异常的程序代码
}
}
}
2.2throws:在方法中声明抛出异常
throws使用在方法头部,声明该方法被调用的时候可能抛出某种异常,但这一种方法我们不知道该I如何处理,而是向后传递直到能够处理它的地方为止。有了throws抛出的异常,我们就可以关注于方法的功能实现,而异常的实现既可以单独编写,也可以交由系统处理。throws的处理方法是:
返回值 方法名() throws 异常1,异常2······
示例:
public class Example04 {
/**
* 异常处理
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
out();
}catch(ArithmeticException e)
{
System.out.println("除数不能是0!");
}
}
public static void out() throws ArithmeticException
{
int i=5/0;
System.out.println(i);
}
}
示例:
利用输入输出类接受字符并输出,这其中涉及到输入输出异常IOException。
public class Example04 {
/**
* 异常处理
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
out();
}catch(IOException e)
{
System.out.println(e.toString());
}
}
public static void out() throws IOException
{
//int i=5/0;
char c=(char)System.in.read();
System.out.println(c);
}
}
2.3throw:抛出异常
throw用于明确抛出异常对象。当程序执行到throw处时,程序返回调用者处处理异常。throw使用语法如下:
throw 异常对象
示例:
public class Example04 {
/**
* 异常处理
* @param args
*/
static int k = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
out();
}catch(ArithmeticException e)
{
System.out.println("除数不能是0!");
}
}
public static void out() throws ArithmeticException
{
if(k==0)
throw new ArithmeticException();
int i=5/k;
System.out.println(i);
}
}
要注意throws和throw的差别:
·throws是声明可能抛出异常,而throw是一定抛出异常
·throws用于方法头部,而throw是用于方法体中
3.自定义异常
Java提供了相当多的异常处理类来处理各种异常。但实际运行中各种异常情况太多,很多异常情况并未有系统定义的异常类,所以我们必须解决这个问题。
Java中提供了这样的机制:Java允许程序员自己定义异常类以处理系统未定义的异常。创建异常类的形式如同穿件一般类。
示例:
public class Example05 {
/**
* 自定义异常类
* @param args
*/
static int k =0;
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
if(k==0) //次此处说明何时抛出自定义异常
{
throw new MyException();
}
int i = 5/k;
}catch(MyException e) //捕获异常
{
System.out.println(e.toString());
}
}
}
class MyException extends Exception //自定义异常
{
public MyException(){ //自定义异常的构造方法
super("除数不能是0!");
}
public MyException(String str){
super(str);
}
}
小结:
异常,是指发生可能导致系统无法运行或运行出现错误的情况,如文件无法打开、用户输入错误、除数为0、数组小标越界等。
异常处理是将接收和处理错误的代码分开。程序员可以着眼于程序功能的实现而不用纠结于异常的处理。这样就增强了程序的可读性,有利于程序的阅读和理解。
对于可能出现的异常,Java使用“异常处理机制”来预防、捕获并处理这些异常。
Java中所有的异常类都是Throwable类的子类。Throwable类有两个重要的子类:Exception类和Error类。Exception类是所有异常类的直接父类,Error类是所有错误类型类的直接父类。
Java中异常处理方式主要有:try-cathc-finally语句、throw语句、throws语句,他们分别可以实现对异常情况的处理。
Java允许程序自定义异常类以处理各种系统未定义的异常。程序员可以通过继承Exception或者其子类来创建自己的异常类。