Java-异常处理

2017-10-16 19:39:57

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常发生的原因有很多,通常包含以下几大类:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

一、程序的问题:Throwable

~ 错误:ERROR,不处理,这种问题一般比较严重,比如内存溢出等,需要进一步解决;

~ 异常:Exception

     * 编译期的异常:不是RuntimeException的异常都需要也是必须被处理的,如果不处理编译器不能通过。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

       * 运行期的异常:RuntimeException异常,这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。

如果程序出现问题,但是程序员没有作出任何处理,最终JVM会作出默认的处理。

也就是把异常的名称,原因以及出现的行号等信息输出在控制台上。

同时会结束程序。

 

二、解决方法

  • try...catch...finally...
try
{
      可能出现问题的代码; 
      尽可能少;      
}
catch(异常名 变量1)
{
      针对问题的处理;
}
catch(异常名 变量2)
{
      针对问题的处理;
}
finally
{
      无论有无异常都会执行,一般只在文件关闭,断开网络连接时使用;
}

* 产生异常对象并中断当前执行的代码,抛出异常对象。

* 自动按程序中的catch的编写顺序查找“最接近的”异常匹配,一旦找到就认为当前的异常已经得到控制,不再进一步搜索。另外,catch中必须对相应的异常作出处理,否则便失去了意义。

* 若有匹配则执行相应的处理代码,然后继续执行try块之后的代码,否则的话,这个没有被捕获的异常将进行默认的异常处理,由JVM进行处理,在控制台输出相关信息,并退出程序的运行。

* 无论什么情况都不会返回出错的地方继续执行。

* 能明确的异常尽量明确,不要只用大的Exception来处理

* 目前也可以使用catch(异常1 | 异常2 |... 异常名),来进行多种异常的处理。但是,处理方式是一致的,并且多个异常间必须是平级关系。

* 异常的常用方法:e.getMessage():返回异常的消息字符串

          e.toString():返回异常的简单信息描述,“包括类的全路径名:错误名 时间”

          e.printStackTrace():获取异常的简单信息描述,相当与调用toString方法,并且还会输出行号的信息

* finally前退出JVM的话,则不会执行finally;如果前面有return ,则依然会执行finally语句,在执行完后在回去进行返回,且不会改变原返回路径中的返回值。

  • throws/throw

如果一个方法没有捕获一个编译期异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。会将方法中的异常抛给调用者处理。

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

import java.io.*;
public class className
{
  public void deposit(double amount) throws RemoteException
  {
    // Method implementation
    throw new RemoteException();
  }
  //Remainder of class definition
}

 

三、自定义的异常

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个编译时异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
  • 构造方法有两个一个无参,一个有参,主要用来把异常信息打印到控制台上。
public class MyException extends Exception
{
public MyException(){};
public MyException(String message) { super(message); }
}

 

四、异常在继承中的注意事项

  • 子类重写父类方法的时候,子类必须抛出与父类一致的异常或者父类异常的子类(父亲坏,子类能更坏)
  • 如果父类方法没有异常抛出,那么子类中覆盖的方法也不可以将异常抛出,可以使用try块进行处理

 

posted @ 2017-10-16 22:19  hyserendipity  阅读(285)  评论(0编辑  收藏  举报