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块进行处理