java异常处理
一 异常(exception)
1.基本写法: try{
语句组;
}
catch(Excepttion ex)
{
异常处理语句组;
}
finally
{
}
2.异常分类:
1 Error :JVM(虚拟机)的错误。
2 Exception:异常(我们现在讨论的)及其子类。
3.Exception类:
1.构造方法 public Exception();
public Exception(String message);
public (String message ,Throwable cause);
2方法:
getMessage();getCause();printStackTrace();(调用堆栈的一些信息)
4.多异常的处理:
子类异常要排在父类异常的前面。
5.finally语句:无论是否有异常都要执行。(即使try其中有break,return 等)
在编译时,finally部分代码生成了很多遍。
6.Exception 代表的就是异常了. 它下面很多派生类, 其中它的派生类也分两种,
一种是RuntimeException(运行时异常), 其他的都是非运行时异常
RuntimeException 包括除数为0, 数组下标超界等.
运行时异常的派生类有很多, 其产生频率较高.
它的派生类可以由程序处理或者抛给(throw) 给jvm处理.
非RuntimeExcption 这种异常属于Excepion的派生类(上面红色的xxx),
但是不是RuntimeException的派生类,
这种异常必须由程序员手动处理,否则不通过编译.
ArithmeticExcpetion 算术异常,
它是RuntimeException的派生类,
所以程序员不手动处理也通过编译, 只不过出错时会被jvm处理.
7.函数并不处理异常,使用throw 或者throws,交给上级处理。
8.当捕捉到一个异常的时候便不会再捕捉其他的异常就会直接执行finally里的语句。
9.实际上, 当java程序的1个函数抛出异常时,
首先会检查当前函数有没有try catch处理, 如果无检查上一级函数有无try…catch处理…
这样在函数栈里一级一级向上检查, 如果直至main函数都无try…catch, 则抛给jvm…
10. throw(s)会中断当前函数, 当前函数执行失败(不完整)。
11.
二 受检的异常:
异常分为两种:RuntimeException及其子类,可以不处理。
checked Exception 受检的异常。明确用语法处理。
如何处理?
1捕 (catch)
2抛 (throws):在方法的签名后用throwsXXX来声明。
在子类中,如果要覆盖父类的一种方法,若父类中的方法说明了
throws异常,则子类的方法也可以用throws抛出异常。但是可以抛出
更具体的异常,不能抛出父类中的异常。(更多异常)
三 try…with…resource
try (类型 变量名 = new 类型()){。。。。}
相当于自动添加了finally{变量.close();}
无论是否异常,都会执行。
四。代码分析:
import java.util.*;
class F
{
public int f(int a,int b)
{
return a/b;
}
}
public class Main {
public static void main(String []args)
{
Scanner reader=new Scanner(System.in);
F f=new F();
int n=f.f(10, 0);
System.out.println(n);
reader.close();
}
}
Exception in thread "main" java.lang.ArithmeticException: / by zero
at F.f(Main.java:7)
at Main.main(Main.java:15)
import java.util.*;
class F
{
public int f(int a,int b)
{
int n=0;
try
{
n=a/b;
}
catch(Exception e)
{
System.out.println(e.getMessage());//输出原因
e.printStackTrace();//输出异常在栈中的情况
}
return n;
}
}
public class Main {
public static void main(String []args)
{
Scanner reader=new Scanner(System.in);
F f=new F();
int n=f.f(10, 0);
System.out.println(n);
reader.close();
}
}
/ by zero
java.lang.ArithmeticException: / by zero
at F.f(Main.java:10)
at Main.main(Main.java:25)
0
package Exception_kng;
class Exp3{
public int f(int a, int b){
if (0 == b){
throw new ArithmeticException("Shit !!! / by zero!");
}
return a/b;
}
}
public class Expt_3{
public static void g() throws ArithmeticException{
Exp3 ex = new Exp3();
int i = 22;
i = ex.f(8,0); //throw excetpion
System.out.printf("i is %d\n", i); //failed executed
System.out.printf("g() is done!!\n"); //failed executed
}
public static void h(){
try{
g();
}catch(ArithmeticException e){
System.out.printf("Exception occurs!!\n");
System.out.println(e.getMessage()); //print the root cause
System.out.printf("===========================\n");
e.printStackTrace(); //print the info of function stuck.
}
System.out.printf("h() is done!!\n"); //successfully executed
}
}
[java] Exception occurs!!
[java] Shit !!! / by zero!
[java] ===========================
[java] java.lang.ArithmeticException: Shit !!! / by zero!
[java] at Exception_kng.Exp3.f(Expt_3.java:6)
[java] at Exception_kng.Expt_3.g(Expt_3.java:18)
[java] at Exception_kng.Expt_3.h(Expt_3.java:25)
[java] at Enter_1.main(Enter_1.java:31)
[java] h() is done!!