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
java异常处理解决方案的更多相关文章
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- java异常处理机制 (转载)
java异常处理机制 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C ...
- Java—异常处理总结
异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...
- “崩溃了?不可能,我全 Catch 住了” | Java 异常处理
前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...
- 基础知识《十一》Java异常处理总结
Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制 ...
- Java异常处理的10个最佳实践
本文作者: ImportNew - 挖坑的张师傅 未经许可,禁止转载! 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可 ...
- Java异常处理只有Try-Catch吗?
今天,我们将讨论一个非常重要的主题-Java 中的异常处理.尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息. Java 中最常见的异常处理机制通常与 try-catch 块 ...
- 《Java基础知识》Java异常处理详解
1. Java 中的异常 前言:Java 中的异常处理是处理程序运行错误时的强大机制之一,它可以保证应用程序的正常流程. 首先我们将了解java异常.异常的类型以及受查和非受查异常之间的区别. 1.1 ...
- Java异常处理总结Exception\Error
Java异常处理总结Exception\Error 2012-12-28 08:17:17| 分类: JAVA | 标签:java |举报|字号 订阅 Java异常处理总结 ...
随机推荐
- Git diff结果显示分析
1.diff的三种格式: 正常格式(normal diff) 上下文格式(context diff) 合并格式(unified diff) 2.示例文件为了便于讲解,先新建两个示例文件.第一个文件叫做 ...
- Python(可变/不可变类型,list,tuple,dict,set)
补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...
- 你见过的最全面的python重点
首先和大家说个对不起,由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西,对于Nginx的东西我没总结在这里,大家可以Python聚焦看,点击直达专栏哦. ...
- 【iCore4 双核心板_uC/OS-II】例程四:软件定时器
一.实验说明: 一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的 延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁. ...
- 解决“Comparison method violates its general contract!”
The ONE跑MaxProp.Prophet可能(取决于你JDK的版本)会报“java.lang.IllegalArgumentException: Comparison method violat ...
- [Linux]linux下取消用户名和密码直接登录
假定目前只有root用户,则有如下两种方式可直接登录系统: 方式一: 1. passwd -d root 2. 修改/lib/systemd/system/serial-getty\@.service ...
- Deepin 系统下安装VMware并激活
1.打开深度商店:搜索VMware,并下载安装. 2.打开启动器:点击VMware-install. 3.填写管理员密码. 4.下一步,完成安装. 5.打开VMware Workstation,输入密 ...
- (原)ffmpeg过滤器开发和理解
最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下: AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串 ...
- Spring-Cloud-Ribbon学习笔记(一):入门
简介 Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎 ...
- laravel5.8笔记四:中间件
应用场景:检测登陆,控制器加载数据,传递常量 命令 //中间件创建命令 php artisan make:middleware Check 注意: 1.需要注册中间件 2.中间件命名不能重复 mi ...
