程序的错误通常包括
●语法错误 (程序的运行不符合语言的语法规则,错误可以被编译程序发现)
●逻辑错误 (程序设计不当造成程序没有完成预期,错误可以被测试发现)
●运行异常 (运行环境环境问题造成程序异常终止)
java中所有操作都是基于对象的,异常也是一样。
当执行过程中遇到异常情况时,将异常信息封装为异常对象,然后抛出,抛出的异常对象将传递给Java 运行时系统(JVM)
Private Muchu(int x) throws OutOfRangeException{
if (x < 0){
throw new OutOfRangeException("Number not positive");
}else{
x1 = x;
}
}
抛出的异常说明在操作中出现了某种未知错误,需要进行判断捕获和处理。
try{
//正常逻辑代码,放入可能发生异常的语句
}catch(ExceptionSubClass1 e){
// 处理异常的语句 1
}catch(ExceptionSubClass2 e){
//处理异常的语句 2
}
try-catch 语句可以由几个 catch 组成,分别处理发生相应异常。
Java 里的 try-catch 语句一般用来处理异常,将可能出现的异常的语句操作放在 try 里,一旦 try 里语句出现异常,就立即结束 try 部分。处理异常的语句放在catch 里。
▲1、如果JVM找到匹配的catch子句,程序仅仅执行第一个匹配的catch代码块,匹配的catch代码块执行完毕后,将执行最后一个catch代码块之后的语句。
▲2、如果IVM在抛出异常的操作体内没有找到匹配的catch子句,那么说明该操作有可能抛出某类异常,但是未捕捉相应的异常对象。在这种情况下,操作将异常对象抛出给调用它的方法,依此类推,直到被捕捉。如果被调用的方法都没有捕捉该异常对象,异常可能路往外传递直达main()而未被捕捉,则运行将终止,相应的Java 程序也将退出。
由于捕捉异常的顺序和不同catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配,因此在安排catch语句的顺序时,首先应该=-捕获子类异常,然 后再逐渐一般化。
package Muchu;
public class ThrowsMain {
public static void main(String args[]){
try{
throw new Exception("自己抛着玩的。") ; // 抛出异常的实例化对象
}catch(Exception e){
System.out.println(e) ;
}
}
};
异常类的基类是 Throwable 。有两个直接子类 : Exception 、 Error
我们需要关心异常类Exception 的直接或间接子类。
Throwable 类的常用方法
类型 | 方法 |
---|---|
String | getMessage()返回此Throwable 的详细信息字符串 |
void | printStackTrace()将此Throwable 及其追踪输出至标准错误流 |
String | toString 返回此Throwable 的简短描述 |
方法示例:
package Muchu;
public class ExcepMod {
public static void f() throws Exception {
throw new Exception("This is my Type Exception");
}
public static void g() throws Exception {
f();
System.out.println("f()后的代码");
}
public static void main(String[] args) {
try
{
g();
System.out.println("后面的。。。");
}
catch(Exception e) {
System.out.println("caught exception here: ");
System.out.println("e.getMessage() :"+e.getMessage());
System.out.println("e.toString :"+e.toString());
System.out.println("e.printStackTrace :");
e.printStackTrace();
}
}
}
假如一个方法体要抛出异常,但是该方法体没有抛出异常的处理代码段(try - catch 块),那么在该方的声明部分必须通过 关键字 Throws 对异常进行抛出声明。
●使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
throws关键字格式:
public 返回值类型 方法名称(参数列表,,,)throws 异常类{};
▶例:除法操作,可能出现异常,默认throws 就会把异常操作交给JVM处理。
package Muchu;
public class ThrowsMain {
public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
int temp = i / j; // 可能出现的异常
return temp;
}
public static void main(String args[]){
ThrowsMain m = new ThrowsMain(); // 实例化Math类对象
try{
System.out.println("除法操作:" + m.div(10,0)) ;
}catch(Exception e){
e.printStackTrace() ; // 打印异常
}
}
}
常见的异常类:
数据格式异常:NumberFormatException
数组越界: ArrayIndexOfBoundException
算术异常类:ArithmeticExecption
空指针引用异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException