异常:就是程序在运行时出现不正常情况。
其实就是java对不正常情况进行描述后的对象体现。
对于严重的,java通过error类进行描述
对于error一般不编写针对性的代码对其进行处理。
对于非严重的,java通过execption类进行描述。
对于execption可以使用针对性的处理方式进行处理。
无论error或者execption都具有一些共性内容。
比如:不正常情况的信息,引发原因等。
public class ExceptionTest { public static void main(String[] args) { div(4,7); System.out.println("main code"); } public static void div(int a,int b) { //捕获异常,当出现异常时,语句直接跳转到catch中进行异常的处理,try中出现异常的后面的语句就不会执行了 try { int temp=a/b; int[] num=new int[a]; System.out.println("temp="+temp); System.out.println(num[a]); } catch(ArithmeticException e) { e.printStackTrace(); //try后可以跟多个catch,应按照子类到父类的排列顺序, //如果try中出现了catch中所有的异常,那么程序会直接抛出异常给上一级 } catch(ArrayIndexOutOfBoundsException e) { e.printStackTrace(); //finally中执行的一般是关闭资源的操作 } finally { System.out.println("一定会执行的语句"); } } }
public class ExceptionTest { public static void main(String[] args) throws Exception { //调用者可以进行try或在函数上声明,如果进行了try那后面的语句还会执行,只是声明那后面的语句就不会执行了 div(4,0); System.out.println("main code"); } //在函数上声明异常,将异常交由上一级处理 public static void div(int a,int b) throws Exception { int temp=a/b; System.out.println("temp="+temp); } }
class Demo { int div(int a,int b) { return a/b; //会产生 new aritchmeticexception(),以前是会传给虚拟机,但是现在有了catch就传给catch了 } } class ExceptionDemo { public static void main(String [] args) { Demo d = new Demo(); try { int x = d.div(4,0); //在这里会产生 System.out.println("x="+x); } catch (Exception e) // exception e = new arithmeticexception(); { //System.out.println("除零了"); System.out.println(e.getMessage());// by zero//获取异常信息/ by zero //System.out.println(e.toString());//异常名称:异常信息。java.lang.ArithmeticException: / by zero //e.printStackTrace();//异常名称,异常信息,异常出现的位置。 //其实jvm的默认的异常处理机制,就是在调用printstacktrace //打印异常的堆栈的跟踪信息 //java.lang.ArithmeticException: / by zero //at cn.itcast.exception.Demo.div(ExceptionDemo.java:7) //at cn.itcast.exception.ExceptionDemo.main(ExceptionDemo.java:18) } } }
class Demo { int div(int a , int b) throws airthmeticexception,arrayindexoutofboundsexcwption //一个是算数异常,一个是越界 { Int[] arr = new int[a]; System.out.println(arr[4]); return a/b; } } class Exceptiondemo1 { public static void main(String[] args)throws exception { Demo d = new Demo(); try { int x = d.div(4,1); System.out.println("x="+x); } catch (airthmeticexception e) { System.out.println(e.tostring()); System.out.println("被零除了!!"); } catch (arrayindexoutofboundsexcwption e) { System.out.println(e.tostring()); System.out.println("角标越界啦!!"); } catch (excwption e) //父类异常catch块处理,父类异常放最后!!! { System.out.println(e.toString()); } System.out.printlln("over"); } }
class FuShuException extends Exception { /* 用super(msg)就可以了 private String msg; FuShuException(String msg) { this.msg = msg; } public String getMessage()//发现打印的结果中只有异常的名称,却没有异常的信息,因为自定义的异常并未定义信息(getmessage) { return msg; } */ private int value; FuShuException() { super(); } FuShuException(String msg, int value) { super(msg); //如何定义异常信息呢? //因为父类中已经把异常信息的操作都完成了。 //所以子类只要在构造时,将异常信息传递给父类通过super语句。 //那么就可以直接通过getMessage方法获取自定义的异常信息 this.value = value; } public int getValue() { return value; } } class Demo { //这里抛出FuShuException是因为一般情况下,函数内出现异常,函数上也需要声明!!! int div(int a , int b)throws FuShuException { if(b<0) throw new FuShuException("出现了除数是负数的情况",b);//手动通过throw关键字抛出一个自定义异常对象 return a/b; //除零自动抛出,负数只能手动抛出 } } class ExceptionDemo3 { public static void main(String[] args) { Demo d= new Demo(); try { int x = d.div(4,-1); System.out.println("x="+x); } catch (FuShuException e) { System.out.println(e.toString()); //toString会自动调用getMessage // System.out.println("除数出现负数了"); System.out.println("错误" + e.getValue()); } System.out.println("over"); } }
class Demo { public void method() { /* try { throw new Exception(); //问题在这里用catch解决了,就不用去method上面声明,如果没有try catch就要申明,否则会报错 } catch (Exception e) { throw e; } */ try { throw new Exception(); //这里method就要声明,否则编译报错,因为没有解决 } finally { //关资源 } } } class { public static void main(String[] args) { System.out.println("Hello World!"); } }
class AException extends Exception { } class BException extends AException { } class CException extends Exception { } /* Exception |--AException |--BException |--CException */ class Fu { void show() throws AException { } } class Test { void function (Fu f) { try { f.show(); } catch (AException e ) { } } } class Zi extends Fu { void show throws Bexception //这里就不能抛父类 { } } class { public static void main(String[] args) { //System.out.println("Hello World!"); Test t = new Test(); t.function(new zi()); //可以看到zi中抛出CException,但是只能处理AException,处理不了CException } }
public class ExceptionDemo { public static void main(String[] args) { System.out.println(test()); } public static String test() { try { System.out .println("try block"); return test1 (); } finally { System.out .println("finally block"); // return "finally";// 如果finally中有返回值,那么finally返回值就会替换掉上一级方法中的返回值 //这一句如果执行,那程序上一级方法中的after return 就会被finally所替换 //有 // try block // return statement // finally block //finally //没有 // try block // return statement // finally block // after return } } public static String test1() { System.out.println("return statement"); return "after return"; } } /* 程序结果为: try block return statement finally block after return 原因分析: 1.try语句块,return test1(),则调用test1方法 2.test1()执行后返回"after return",返回值"after return"保存在一个临时区域里 3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值 4.将临时区域的返回值送到上一级方法中。 */ public class ExceptionTest { public static void main(String[] args) { int a=5; int[] arr=new int[5]; //return 0;要想让方法停止运行可以return或throw个异常 int i=a/0; try { System.out.println(arr[6]); } catch(ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); System.out.println("角标越界"); //这里的finally语句是不会执行的,因为在try语句之前程序就已经停止运行了 } finally { System.out.println("finally"); } } }
class FuShuException extends Exception { FuShuException(String msg) { super(msg); } } class Demo { int div(int a , int b )throws FuShuException { if(b<0) throw new FuShuException("除数为负数"); return a/b; } } class ExceptionDemo6 { public static void main(String[] args) { Demo d =new Demo(); try { int x = d.div(4,-1); System.out.println("x="+x); } catch (FuShuException e) { System.out.println(e.toString()); } finally { //即使catch中有return也会执行finally System.out.println("finally");//finally中存放的代码是一定会执行的 } System.out.println("over"); } } class NoException extends Exception { } //数据库类似于服务器,可以建立的连接数量有限,所以用完就要释放,要不然别人就没法用 //这里不能throws SQLException ,因为调用method的对象不懂SQLException //所以抛出也没用,这里只能抛出throws Noexception(数据没存成功) //类似于销售问仓库要货,仓库发现要的货发霉了(SQLException) //发霉了只能仓库处理,但是仓库要告诉销售没有货(Noexception) public void method() throws Noexception { 连接数据库; 数据操作;//throw new SQLException(); 关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源 try { 连接数据库; 数据操作;//throw new SQLException(); } catch (SQLException e) { 会对数据库进行异常处理; throw new NoException(); } finally { 关闭数据库;//该动作,无论数据操作是否成功,一定要关闭资源 } }