1、异常是运行可能出现的错误,运行时捕捉的异常Exception,不是编译错误error语法错误。
2、怎么处理异常?处理机制
当整个程序,一旦发现某一部分出错,整个程序的流程打断,寻找有没有对异常处理代码,若没有继续调到调用函数的程序找。若没有再回到main函数找,没有则抛给jvm,给显示器输出。异常是对象。
优点:通过try{} catach(){}将错误的捕捉和处理,处理错误的能力增强。健壮性强。传统利用if语句,若。。。则。。。只能把想到错误考虑,可读性差,出错返回信息少。异常并不是能解决所有问题
总之:考虑程序的安全性和健壮性
增强对程序的可控性
有利用code调试
把错误代码从常规代码中分离出来
缺点:
try{
可能出错的代码aa.divide(6,0); //jvm自动生成异常对象
}
catch(错误ArithmetiException e) //e用来接收上面抛出的异常对象,不允许抛出两个异常。。。
{
e.printfStackTrace();//输出异常的具体信息
System.out.printf(“程序中除数为零的错误”);//对错误的处理,处理完下面程序继续运行!
}
下面的代码仍可以运行!
异常的分类:
运行时抛出异常均是Exception(是程序员可以捕捉并处理的异常)的子类。
RuntimeException是可处理可不处理的异常.
凡是继承Exception但又不是RuntimeException的子类的异常,通常必须进行捕捉并处理。
检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。
3、为什么用trycatch{}不用if…else…
无法事先确定数据什么情况,无法进行处理。
package java_part;
import java.util.*;
public class TestExcep_3{
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
try {
int i = sc.nextInt () ;
System.out.printf("i=%d\n",i);
}
catch(InputMismatchException e){
System.out.printf("输入数据不合法");
}
}
}
3、异常处理的两种方法
throw抛出异常对象,throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常.
throw new IOException
throws当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理,表示本方法不处理,交给被调用者处理。
对于f内部也可以自行处理,利用try catch自己处理。
对比:
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
public class testThrows(){
public static void function() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能强制类型转换。");
//e.printStackTrace();
}
}
4、finally
无论catch{}是否,finally代码一定输出。
为什么利用finally?
5、自定义异常
(1)继承Excepyion
(2)定义构造方法,利用super()
import java.io.*;
class DivisorIsZeroException extends Exception
{
public DivisorIsZeroException(String name)
{
super(name);
}
}
class A
{
public int divide(int a, int b) throws DivisorIsZeroException
{
int m = 0;
if (0 == b)
throw new DivisorIsZeroException("除数不能为零! O(∩_∩)O哈哈~");
else
m = a/b;
return m;
}
}
public class TestExcep_7
{
public static void main(String[] args) //throws IOException
{
A aa = new A();
try
{
aa.divide(6, 0);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
throws函数抛出异常,不对异常进行处理,让被调用处理,方法内部也可以不抛出异常,所以也不一定对异常(关键是什么异常,RuntimeException可以不处理)进行处理。
throws时候并不一定就必须throw异常,调用函数也不一定进行对异常捕获。这样不太好。
总之:1、若自己定义的方法中,函数f内部用throw,函数声明处最好加throws;
2、若要调用一个函数,其中利用了throws,无论函数抛出的异常是什么异常,都需要在调用的函数中进行try catch处理。
子类继承父类,父类抛出异常A,B。子类抛出异常的范围不能超过父类。因为多态。父类的引用可以指向父类对象,想把子类中所有f方法调用。