java异常处理解决方案

一、异常概念

   Throwable类是Java中所有错误或异常的超类。


    1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出。 
    2.只有此类或其子类才可以是catch字句中的参数类型。 
    3.有两个直接子类:Error和Exception 
        Error--指应用程序不应该去处理捕获的一种严重问题,常表示系统级的错误,如内存溢出 
       Exception--指程序需要捕获,需要处理的异常,是一种设计或实现方面的问题。 
            Exception分为两类:RuntimeException和CheckedException 
               RuntimeException--运行时异常,由程序员错误导致,不需要捕获处理,直接由 
                            虚拟机接管,层层上抛,记录日志,程序员应尽量避免此种异常。 
                CheckedException--一般异常,需要进行catch,如IO异常和SQL异常等。 
                 
        注:Error是不需要程序员关心的,属于系统级的错误 
             RuntimeException需要程序员注意逻辑和编码上的谨慎,尽量避免此种错误发生 
             CheckedException需要进行捕获处理 
    

    
二、常见的RuntimeException异常:

   1.ArithmeticException 算数异常--如最常见的除数为0 
    
    2.ArrayindexOutOfBoundsException 数组下标越界异常,但需要遍历数组时,用foreach或者ArraryList可避免此异常。 
    
    3.ClassCastException 强制转换异常 
    
    4.ClassNotFoundException 找不到指定类异常,此类异常常发生于以下几种情况, 
                                          如:Class类中的forName方法 
                                               ClassLoader类中的findSystemClass方法 
                                               ClassLoader类中的loadClass方法 
                                
    5.NullPointException 空指针异常,当应用程序试图在需要对象的地方使用null时,抛出此异常: 
                                  如:调用null对象的实例方法 
                                       访问或修改null对象的字段 
                                       将null作为一个数组,获得其长度 
                                       将null作为一个数组,访问或修改其元素值 
                                       将null作为Throwable值抛出 
                                  要避免此类异常可在定义引用类型变量就对其初始化,或者在使用此变量进行是否为空判断。 
    
    6.ArrayStoreException 数组存值异常--即元素类型不一致时抛出此异常,但若数组引用类型为Object则不会抛出此异常。 

四、对异常的处理

throw: 
    使用throw关键字可以在方法体中抛出异常。该异常既可以使系统预定义异常,也可是用户自定义异常; 
    throw总是出现在函数体中,用来抛出一个具体异常。程序会在throw语句后立即终止,它后面的语句执 
    行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子 
    句的try块: 
    
        throw 异常对象; 
        此时要抛出异常必须要应用在方法体中。

throws: 
    使用throws关键字可能会抛出异常;该异常既可以使系统预定义异常,也可是用户自定义异常; 
    throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception 
    子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是 
    Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中 
    是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的 
    类型。 
    
        [<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>] 
       注:异常类可以声明多个,用逗号分割。 
    
    
throw和throws的区别: 
    1.前者在方法体中使用,是一个语句,用于抛出具体的异常;后者在声明方法时使用,是一个方法,用于声明可能抛出的异常。 
    2.前者不能单独使用,要么和try-catch-finally配套,要么和throws配套;后者可单独使用。 
    3.使用前者,则一定会抛出异常,使用后者则可能会抛出异常 
    4.程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻 
      找含有与其匹配的catch子句的try块。    
      
为预定于异常添加提示信息: 
    
    对于系统预定义的异常,一般而言至少有两个构造函数,即有参构造和无参构造。程序员可以使用有参构造方法来添加提示 信息。


    代码实例:

复制代码
package com.xhj.exception;

/**
 * 为预定于异常添加提示信息:
 * 
 * @author XIEHEJUN
 * 
 */
public class AddExceptionMessage {

    public static void throwException() {
        throw new UnsupportedOperationException("没有任何数据");
    }

    public static void main(String[] args) {
        try {
            AddExceptionMessage.throwException();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}
复制代码
用户自定义异常:


    虽然Java本身定义的异常类已经十分的丰富齐全,但是在实际应用当中,需求总是千变万化的。 
    当需求需要而Java预定义异常类中却没有时,编程人员可通过自定义异常类来满足开发需求。 
    
    要编写一个自定义的异常类很简单,只需要继承Exception类或其子类,然后实现其构造方法即可。 
       public class MyException extends Exception{} 
        
   代码实例:

复制代码
package com.xhj.exception;

/**
 * 自定义异常
 * 
 * @author XIEHEJUN
 * 
 */
public class MyDefinedException extends Exception {

    public MyDefinedException(String message) {
        super(message);

    }

    public static void main(String[] args) throws MyDefinedException {
        
        String[] str = { "1", "2", "3", "4", "5", "6" };
        for (String string : str) {
            if (string.equals("6")) {
                throw new MyDefinedException("此数据不能大于其字节长度!");
            }
        }
        
    }

}
复制代码

捕获异常:

当遇到异常,我们一般有两种解决方案:一种当然是将异常抛出;另外一种就是将异常捕获。 
抛出异常是一个很简单的行为,但是这个简单的行为将会让程序直接退出。而在实际需求当中, 
并不是什么异常都能抛出的,因为不管怎么样,我们总是要保持程序处于运行状态的,不然也就没有什么意义了。

    异常的捕获要通过try--catch--finally语句块来完成:


    1.try是不可缺少额语句块,主要用来放置可能出现异常的语句; 
    2.catch和finally两者至少要有一个1个与try配套; 
    3.catch块是用来放置异常发生后的处理语句; 
    4.finally里放置的则是无论发生异常与否都会执行的语句。 
    
    注:对异常进行捕获会占用很高的内存,因此try块中的语句要尽量少。 
    
   try--catch--finally的执行顺序: 
    
    实例代码:

复制代码
package com.xhj.exception;

/**
 * 认识try--catch--finally的执行顺序
 * 
 * @author XIEHEJUN
 * 
 */
public class ExecuteExceptionShort {

    public static void main(String[] args) {
        String[] strs = new String[5];
        try {
            int i = strs.length;
            System.out.println("----进入try代码块----");
            System.out.println("String数组大小为:" + i);
            String str = "我是丑小鸭!";
            strs[5] = str;
            System.out.println("strs[5] = " + strs[5]);
            System.out.println("----离开try代码块----");
        } catch (Exception e) {
            System.out.println("----进入catch代码块----");
            System.out.println("异常为: " + e.toString());
            System.out.println("----离开catch代码块----");
        } finally {
            System.out.println("----进入finally代码块----");
            strs[4] = "我是美丽的白天鹅";
            System.out.println(strs[4]);
            System.out.println("----离开finally代码块----");
        }

    }

}
复制代码


注:try--catch--finally语句块可捕获多个异常,但是在捕获多个异常的时候一定要注多个catch的执行顺序, 
所要捕获的异常一定要从小到大排列。当然也可直接通过所有异常的父类Exception,来简单处理。

WebDriver 异常处理

1.Exception NoSuchElementException:
  解决方法:
  1)检查目标element的locator
  2)如果locator是正确的,尝试在查找element之前等待页面的加载
  3)如果等待了很久也一直没有找到element,尝试使用另外一个locator
2.Exception NoSuchWindowException
  解决方法:
  1)检查窗口的locator
  2)在找窗口之前,等到页面的加载
3.Exception NoAlertPresentException
  解决方法:
  1)确认alert(javascript 顶层的窗口,不是最新的)是当前的
  2)在操作alert之前等待页面的加载
4.Exception NoSuchFrameException
  解决方法:
  1)检查frame的locator
  2)检查这个frame是否有一些父frame(如果有父frame的话,应该先转换到父frame)
  3)在转换到目标frame之前,确认转换到了默认的content(仅有一个frame)
  4)在转换frame之前等待页面的加载
5.Exception UnhandledAlertException
  解决方法:
  try catch
6.Exception UnexpectedTagNameException
  解决方法:
  try catch
7.Exception StaleElementReferenceException
  解决方法:
  try catch
8.Exception TimeoutException
  解决方法:
  try catch

原文地址:https://www.cnblogs.com/Shanghai-vame/p/9170262.html