JAVA异常
java异常概念
尽管程序员代码尽善尽美,在系统运行时仍会出现问题,很多问题不是代码能够解决的,如读取文件是否存在,网络是否通畅等
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。
异常分类
• Error : Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
• Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理 例如:
访问数组下标越界
试图读取不存在的文件
网络连接中断
异常的处理方法
1程序发生异常停止运行
2程序员在编译期间对异常进行捕获处理等,但是有些异常是在程序运行阶段才报错
异常分为编译时异常和运行时异常
常见的运行时异常(RuntimeException)有:除数为0(数学异常),数组访问越界,空指针异常等
编译时异常(CheckedException) : 如(IOException) IO异常, (SQLException)数据库异常
异常体系
异常处理
异常处理机制为程序提供了错误处理能力
异常处理5个关键字:try ,catch,finally,throw,throws
对两种处理方法的理解
throw手动抛出异常相当于你犯了错,假如你对公司造成了几百万的损失,throws声明相当于你可以向组长反映,甩锅给组长,组长又甩锅给经理,经理甩锅给ceo,ceo说公司没这么多钱,公司倒闭,相当于程序崩了。
try catch相当于你反映给领导,领导说自己钱够先垫着,问题解决了,不会继续上抛。
一般main方法中选择try–catch 相当于ceo说集资,问题肯定能解决,不然公司就倒闭了
组合起来处理异常有
try {代码块} //其中try代码块为可能出现异常的代码
catch{代码块}//catch进行对异常的捕捉,打印异常信息等操作
try{代码块}//同上
catch{代码块}//同上
finally{代码块}//同上
try{代码块}
finally{代码块}
//finally代码块无论程序有误异常一定会被执行
假如try或者catch中有返回值,finally语句在它前面会执行
finally代码块一般会放程序必须执行的,如io流使用完的关闭
try—catch—finally
一个try可对应多个catch,需要注意的是catch的异常类型
只能有小到大,如下IOException只能声明在Exception前
//try--catch--finally结构
private static int test2(int a,int b) {
try {
int c = a/b;
return c;
}catch (IOException e){
return -1;
}
catch(Exception)
finally {
System.out.println("finally 代码块");//IO 数据库
}
}
throw和throws
调用者需要声明被调用的异常,否则编译报错,
public static void main(String[] args) {
try {
doSome1();
} catch (Exception e) {
e.printStackTrace();
}
}//main方法处理异常一般选择try-catch捕捉,
//因为出现异常传入JVM,程序会终止
public static void doSome1()throws Exception{
doSome2();//若不声明异常此处编译报错
}
public static void doSome2()throws Exception{
}
}
获取异常信息,用在catch{}代码块中
//方法一
e.printStackTrace();
//方法二
System.out.print(e.getmassage)
throw和throws
throw为声明异常,而throws为抛出异常对象
public void doSome()throws IOException,异常2,异常3
{ //throws可声明多个异常 }
throws new Exception("错误原因")
//抛出一个异常对象
存在继承关系 子类声明异常范围需要小于父类
class A throws异常1{
}
class B extends A throws 异常2{}
//存在继承关系 子类声明异常范围需要小于父类
//也就是说异常2与异常1相同或者是其子类
自定义异常
public class myException extends Exception{
myException(){};//无惨构造
myException(String s){
super(s);}//有参构造继承Ecxeption
//自定义方法往往只需要重载构造方法
}
举例:定义一个判断是否构成三角形的异常,若不满足三角形边长条件,抛出异常
package yichang;
public class SJX {
double a,b,c;
public SJX(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
public boolean IfSjx() throws SJXException {
if((a+b)>c&&(a+c)>b&&(b+c)>a){
System.out.println("OK");
}
else{
throw new SJXException("No");
}
return false;
}
}
public class SJXException extends Exception{
SJXException(){};
SJXException(String s){
super(s);
}
}
public class SJXtext {
public static void main(String[] args) {
SJX sjx =new SJX(1,1,100);
try {
sjx.IfSjx();
} catch (SJXException e) {
e.printStackTrace();//打印异常信息
//也可以使用System.out.print(e.getmassage)
System.out.println(e.getMessage());
}
}
}
总结:
出现编译时异常,程序编译时需对其处理,当然运行时异常无需处理
如何选择try–catch(–finally)或者throw?
取决于我们的目的,如果为了给用户提出相关错误信息,选择throw向上一级抛出,同时结合自定义异常,满足用户需求
只是为了处理的话选择try–catch即可