程序错误
编译错误
因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。
运行时错误
因为程序在执行时,运行环境发现了不能执行的操作。
逻辑错误
因为程序没有按照预期的顺序和逻辑执行。
异常
程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等。
如果置之不理,程序便会终止或直接导致系统崩溃,显然这不是我们希望看到的结果。
异常处理机制就是指当程序出现错误后,程序如何处理。
具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
Throwable是所有异常的共同祖先,异常都是从Throwable继承而来的。Throwable有两个子类,Error和Exception。
Error是错误,表示运行应用程序中出现了严重的错误,都是通过Error抛出的,一般是程序不能处理的系统错误。
Exception是异常,表示程序运行时,程序本身可以捕获并且可以处理的错误。
异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。
Error类包括一些不能被程序员处理的严重的系统错误类,共有12个直接子类,一般表示代码运行时 JVM(Java 虚拟机)出现的问题,如内存溢出、虚拟机错误、栈溢出等。
这类错误与硬件有关,大多数错误与代码编写者执行的操作无关,通常由系统进行处理,程序本身无法捕获和处理。
如:当JVM耗完可用内存时,将出现OutOfMemoryError。如Java虚拟机运行错误,将出现VirtualMachineError、类定义错误将出现NoClassDefFoundError等。
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
运行时异常(不受检异常) – RuntimeException类及其子类:表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求必须处理异常。
如:空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
非运行时异常(受检异常) --除RuntimeException及其子类之外的异常,如果程序中出现此类异常,如IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException
try { ...
//监视代码执行过程,一旦返现异常则直接跳转至catch,
// 如果没有异常则直接跳转至finally}
catch (ExceptionType ExceptionObject) {
//可选执行的代码块,如果没有任何异常发生则不会执行;
//如果发现异常则进行处理或向上抛出。}
finally {
//可选执行的代码块,不管是否有异常发生,
//即使内存溢出异常也执行,通常用于处理善后清理工作。}
try {
// 可能会发生异常的程序代码 }
catch (Type1 id1) {
// 捕获并处理try抛出的异常类型Type1
} catch (Type2 id2) { // 在try后面可以跟多个catch。
// 捕获并处理try抛出的异常类型Type2
} finally {
// 无论是否发生异常,都将执行的语句块
}
运行时异常只有运行时才会出现,将出现异常的语句使用try- catch-finally结构包裹即可。
int a=10,b=0,x=0;
try {
x=a/b;
System.out.println(x);
} catch (ArithmeticException e) {
e.printStackTrace();
}
// 等价于
int a=10,b=0,x=0;
if (b!=0) {
x = a / b;
System.out.println(x);
}
else
System.out.println("b=0");
存在多个异常的时候。异常的产生是由于语句中的异常顺序决定的。
int a=10,b=0,x=0;
try {
int y[]=new int[-2];
x=a/b;
System.out.println(x);
}catch (ArithmeticException e) {
e.printStackTrace();
}catch (NegativeArraySizeException e) {
e.printStackTrace();
}
// 首先发现异常的是越界,然后将catch,try中的语句不再执行。
try-catch-finally语句的嵌套
Java语言的try-catch-finally语句可以嵌套,即在try块中可以包含另外的try-catch-finally语句。
try{
嵌套外层代码
try{ 嵌套内层代码 }
catch(ExceptionType1 ExceptionObject1){
处理内层异常 }
finally {内层出口}
}
catch(ExceptionType2 ExceptionObject2)
{处理外层异常 }
finally {外层出口}
Throwable类中的常用方法
getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
getMeage():返回异常的消息信息。
printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
toString():获取异常类名和异常信息(即简单的异常信息描述),
自定义异常类
银行的异常类的定义。
public class BankExcpetion extends Exception{
String message;
public BankExcpetion(int m, int n) {
message = "Error";
}
public String warnMess (){
return message;
}
}
public class Bank {
int now;
public void income (int in, int out) throws BankExcpetion{
if(in < 0 || out > 0)
throw new BankExcpetion(in, out);
int income = in + out;
}
}
class app {
public static void main(String[] args) {
Bank bank = new Bank();
try {
bank.income(100,-200);
bank.income(50,50);
}catch (BankExcpetion e) {
System.out.println(e.warnMess());
}
}
}