• Java学习异常


    异常:就是Java代码在运行时期发生的问题

    异常的继承体系

    Throwable类是所有错误和异常的祖宗类

    在Throwable类下有两大子类:Error类和Exception类

    Error类:指在程序运行期间发生了某种错误,没有具体的处理办法,程序就结束了。

                   Error错误的发生一般都是系统级别的,只能修改代码

    Exception类编译时期异常,一般是编译Java程序时出现的问题

    在Exception下的RuntimeException子类,是运行时期异常,是Java程序在运行时期发生的问题

    异常产生的过程分析

    public static int getArray(int[] arr)  {
    		int i = arr[3];
    		return i;
    	}
    
    public static void main(String[] args) throws Exception {
    		int[] arr = {1,3};
    		int i = getArray(arr);
    		System.out.println(i);
    	}
    

      

    过程:1、JVM自动检测到数组越界异常,此时JVM会自动创建一个对象new ArrayIndexOutOfBoundsException(),JVM将异常抛给它的调用者

              2、在main方法中找到调用者,一看没有得到处理,就继续往上抛,抛给JVM

              3、JVM收到抛出的异常

                    a:将异常信息以红字的形式打印在控制台上

                    b:结束程序

    所以代码修改为:

    public static int getArray(int[] arr) throws Exception {
    		if (arr == null) {
    			throw new Exception("你传进来的数组是null");
    		}
    		if (arr.length < 3) {
    			throw new Exception("你传得数组长度太小了,请传三个以上");
    		}
    		int i = arr[3];
    		return i;
    	}
    
    public static void main(String[] args) throws Exception {
    		int[] arr = {1,3,5,7};
    		int i = getArray(arr);
    		System.out.println(i);
    	}
    

    异常的处理方式

    1、throws

    2、try.....catch 或 try...catch...finally

    在Java中,用throw关键字抛出一个异常对象    throw  new  异常类名(参数)    如:throw  new  Exception();

    声明异常throws:异常已经抛出,但是需要需要声明给调用者   在方法后面加上 throws  异常类名1,异常类名2.....

      try{
            被检测得代码
            可能出现异常得代码
      }catch(异常类名 变量名){
            异常得处理方式
      }finally{
            必须要执行得代码
      }
     作用:try检测到有异常得发生,接收到一个异常对象,将异常对象抛给catch代码块处理,catch捕获到这个异常对象,那么就执行处理方式代码

                finally代码块里面的内容是一定要执行的,一般是释放资源的,如关闭数据库,关闭文件

    多个catch处理的注意事项

    多个catch时:1、看抛出的异常是否是平级关系(是否有继承)

                                如:NullPointerException extends  RuntimeException                               

                                       ArrayIndexOutOfBoundsException extends   RuntimeException

                                       如果没有继承就可以随便写
                          2、如果有上下级关系,就必须把下级放前面,上级放后面
                               如:Exception 上级
                                      NullPointerException 下级
                                      如果把Exception放到了NullPointerException的前面,若方法中首先抛出的NullPointerException 异常,它会转到catch处,Exception首先接收,就会形                                      成多态关系(父类引用指向子类对象),那么后面catch中的NullPointerException就会没有作用,编译报错

    public static int getArray(int[] arr) throws NullPointerException, ArrayIndexOutOfBoundsException {
    		if (arr == null) {
    			// 抛出一个异常对象,谁调用就抛给谁
    			// 然后声明异常 throws NullPointerException
    			throw new NullPointerException("你传的数组为空");
    		}
    		if (arr.length < 3) {
    			throw new ArrayIndexOutOfBoundsException("你传得数组长度不够");
    		}
    		return arr[arr.length - 1];
    	}
    
    
    	public static void main(String[] args) {
    		int[] arr = null;
    		try {
    			int i = getArray(arr); // 异常抛到here
    			System.out.println(i);
    		} catch (NullPointerException ex) {  
    //NullPointerException extends RuntimeException //getMessage()方法打印的是传入的字符串 System.out.println(ex.getMessage()); //printStackTrace()打印的是完整的异常信息,包括类名+字符串+报错位置 ex.printStackTrace(); } catch (ArrayIndexOutOfBoundsException ex) {
    //ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException
    //IndexOutOfBoundsException extends RuntimeException //toString方法打印的是完整的异常类名+传入的字符串 System.out.println(ex.toString()); }finally{ //finally用于存放释放资源得代码,如:关闭数据库,关闭文件等 System.out.println("必须要执行得代码"); } System.out.println("Game Over"); }

    运行时期异常和编译时期异常

    运行时期异常: 方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

                   运行时期异常一旦发生,需要程序人员修改源代码.

                              RuntimeException和他的所有子类异常,都属于运行时期异常。NullPointerException,ArrayIndexOutOfBoundsException等都属于运行时期异常

    编译时期异常:只要调用了抛出异常的方法,但是没有处理,就会编译失败   处理方式(try   throws)   必须用throws声明

    异常在方法重写中的细节问题

    class Fu{
    	public void fumethod(){
    		
    	}
    }
    
    class Zi extends Fu{
    	public void fumethod(){
    	   try {
    		method();
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	}
    	public void method() throws Exception{
    		
    	}
    }
    

    父类中有异常方法

          子类继承父类重写这个异常方法的时候,注意:   

          1、子类可以选择不抛出,但是如果子类选择抛出异常   那么你抛出的异常类不得超过你父类的异常,可以是你父类的异常也可以是你父类异常的子类

     当父类方法中没有抛异常时

          1、你子类重写这个方法也不可以抛异常
          2、父类方法中没有抛异常,但是子类重写这个方法时,在方法中调用了带有抛出异常的方法
               由于父类没有抛异常,那么只能try catch处理这个异常,不能throws

    异常中常用的方法

     getMessage方法:返回该异常的详细信息字符串,即异常提示信息

     toString方法:返回该异常的名称+详细信息字符串

     printStackTrace:在控制台输出该异常的名称+详细信息字符串+异常出现的代码位置

     自定义异常类

    NullPointerException异常类源代码:

    public class NullPointerException extends RuntimeException {

        public NullPointerException() {

            super();//调用父类构造方法

        }

        public NullPointerException(String s) {

            super(s);//调用父类具有异常信息的构造方法

        }

    }

    格式:

    Class 异常名 extends Exception{ //或继承RuntimeException

            public 异常名(){

            }

           public 异常名(String s){

                  super(s);

           }

    }

    package com.oracle.demo1;
    
    public class Test {
    	public static void main(String[] args) {
    		// 定义一个方法 计算平均数的方法
    		System.out.println(avgnum(2, -4, 5, 6));
    	}
    
    	public static double avgnum(double... b) {
    		double sum = 0;
    		for (int i = 0; i < b.length; i++) {
    			if (b[i] < 0) {
    				throw new FuShuException("你传入的是负数");
    			}
    			sum = sum + b[i];
    		}
    		return sum / b.length;
    	}
    }
    
    package com.oracle.demo1;
    
    public class FuShuException extends RuntimeException {
    	public FuShuException(String s) {
    		super(s);
    	}
    
    	public FuShuException() {
    		super();
    	}
    }
    

      

  • 相关阅读:
    sql server 中having 的使用注意事项
    js截取字符串
    .net截取字符串
    序列化二叉树
    把二叉树打印成多行
    35 拷贝赋值函数、虚函数
    34 char类型转换为int类型
    33 单/双精度有效数字、程序运行过程
    32 C++常见错误集锦
    31 位域、空类的sizeof值
  • 原文地址:https://www.cnblogs.com/Java-125/p/8882769.html
Copyright © 2020-2023  润新知