Exception-异常
异常(Exception)是程序执行过程中所产生的问题
产生原因:用户输入无效数字、找不到需要打开的文件、在通讯中网络连接中断、JVM发生了内存溢出
异常的三个种类:检查异常、运行时异常、错误(类似异常、无法控制)
异常(Exception)处理:捕获异常不让它沿着调用栈继续向下抛出、
捕获并继续向下抛出、
不捕获导致方法从调用栈中弹出异常对象继续抛给调用栈的main()方法。
Throwable 类是 Java 语言中所有错误(Error)或异常(Exception)的超类(这就是一切皆可抛的东西)。
它有两个子类:Error和Exception。
① RuntimeException和 IOException等继承Exception,具体的RuntimeException继承RuntimeException。
② Error和RuntimeException及其子类成为运行时异常(unchecked)。其他的称为检查异常(checked)。
粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.
绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...
而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。
非RuntimeException(checkedException)和RuntimeException(uncheckedException)区别
① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。 也可以主动抛出异常,停止程序运行。if(obj==null){throw new exception};......
②其他非RuntimeException(IOException等等):这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
1. checkedException 在程序中必须使用try...catch进行处理。
比如一个IO系统的设计者会认为诸如物理文件不存在或者介质无法读取等异常时很可能 发生,而使用者完全可能捕获这个异常,通过让用户 重新输入文件名等方式重新进行这个操作,也就是说,这是一个可恢复的操作。所以我会在诸如 read()/write()等操作中throw 一个 IOException(checked exception)。同时还要在Finally中关闭连接,数据库连接同理。(记得File 如果没有找到,然后file.close()会抛异常,所以要先判断file是否为null)
2. RuntimeException可以不使用try...catch进行处理但是如果有异常产生则异常将由JVM进行处理。
对于RuntimeException的子类最好也使用异常处理机制。虽然
RuntimeException的异常可以不使用try...catch进行处理但是如果一旦发生异常则肯定会导致程序中断执行所以为了保证程 序再出错后依然可以执行在开发代码时最好使用try...catch的异常处理机制进行处理
RuntimeException也可以说是程序员的错误,程序员可以通过优秀的代码编写,来避免runtimeException.
运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。而Exception是指出现错误后,可以由程序员进行补救或其他工作。
异常处理:
1.简单的处理异常,直接printstack 印栈跟踪信息
4.在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。
2.不指定具体的异常
3.保证所有资源都被正确释放。充分运用finally关键词。
5.过于庞大的try块
6.输出数据不完整(只要有数据输出或者写文件,一定要特别考虑异常发生会导致的结果)
try{}catch语句块:
try{
//被保护的语句块
}catch(异常声明(ex:FileNotFoundException f){
//捕获块 ex:直接printstack 印栈跟踪信息的语句为:f.printstack();
}
一个try{}catch并不能捕获一切所以可有多个catch语句。
因多态的原因(父子类关系):Catch块不能随意列出,所以将Catch声明的时异常中子类写在前面
Finally语句:出现在try{}catch的最后,总是会被执行(ex:清理类型的语句)
注:异常处理和声明规则不适用于运行时异常。
声明异常:
若一个方法未处理检查异常那么该方法就必须使用Throws关键字来声明异常,放在方法签名末尾
ex:声明抛出一个RemoteException异常(public void deposit(double amount)Throws RemoteException){});
若要声明多个,异常间用“,”隔开即可。
抛出异常:
Throw:抛出异常,导致当前代码立即停止执行异常将抛给调用栈的前一个方法。
Throw new Exception or RuntimeException();
抛出检查异常时需用Throws在方法签名处声明。
自定义异常:
所有异常必须是Throwable 的子类
编写检查异常时需继承Exception 类
编写运行时类需继承RuntimeException类
注:自定义异常通常是定义一个继承自Exception类的子类。
一般情况下我们都会直接继承自Exception类,而不会继承某个运行时的异常类。
import java.util.Scanner;
public class Exception1 {
//输入字符串判断
public static void main(String[] args) {
Scanner input= new Scanner(System.in); //输入声明
System.out.println("输入数字字符串");
String StringOne=input.next(); //第一个
String StringTwo=input.next(); //第二个
try{
//类型转换
Integer.parseInt(StringOne);
Integer.parseInt(StringTwo);
} catch(ArrayIndexOutOfBoundsException a){
System.out.println("您未输入");//提示未输入
a.printStackTrace();
/*未输入时: String StringOne=null;
String StringTwo=null;
输入数字字符串
请输入整型数据
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:454)
at java.lang.Integer.parseInt(Integer.java:527)
at exception1.Exception1.main(Exception1.java:13)*/
return ;
}catch(NumberFormatException n){
System.out.println("请输入整型数据");
/*输入不为整型时:
输入数字字符串
234e
3333d
请输入整型数据
java.lang.NumberFormatException: For input string: "234e"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at exception1.Exception1.main(Exception1.java:13)*/
n.printStackTrace();
} catch(RuntimeException r){
System.out.println("发生错误");//运行时错误
r.printStackTrace();}
System.out.println("IntOne:"+Integer.parseInt(StringOne)+",IntTwo:"+Integer.parseInt(StringTwo)
+"\n两数乘积为:"+(Integer.parseInt(StringOne)*Integer.parseInt(StringTwo)));
}
}
补充:Thread.sleep(5000); //休眠5秒
Exception-异常的更多相关文章
- 正确使用Exception异常对象
一.异常的构成 new Exception() 创建异常对象 throw 抛出异常对象(主要性能损耗位置) try{}catch{} 捕捉异常对象 C#里面异常对象分为两个子类ApplicationE ...
- terminate called without an active exception异常
在gcc4.4下,采用回调机制写了一个类似std::thread的线程类. 但是使用时却发生了核心已转移的错误. main函数调用的代码大致是 int main(int argc, char *arg ...
- throws/throw Exception 异常应用
throws通常用于方法的声明,当方法中发生异常的时候,却不想在方法中对异常进行处理的时候,就可以在声明方法时, 使用throws声明抛出的异常,然后再调用该方法的其他方法中对异常进行处理(如使用tr ...
- Interrupted Exception异常可能没你想的那么简单!
摘要: 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常.如果我们对InterruptedException异常处理 ...
- PHP中Exception异常
异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...
- Exception异常
JAVA异常指的是运行期出现的错误. 观察错误的名字和行号最重要. 运用关键字try将可能出错的语句catch出来并添加友好的话 \ 在这句话中的ae代表一个自己命名的对象. 1.要捕获首先需要知道错 ...
- log4j记录exception异常有价值信息及log4j级别
try{ }catch(Exception e){ e.printStackTrace(); log.error("配件导出excel错误:", e.fillInStackTrac ...
- javax.servlet.ServletException: Servlet execution threw an exception 异常解决之一
配置JDBC连接的JDBC.properties文件不存在(那天很奇怪配置文件不存在了,我也没有去移动那个文件.诡异呀)也会导致这个异常. 然后就报javax.servlet.ServletExcep ...
- C# 各类常见Exception 异常信息
一直对报错有些迷惑的地方,什么时候try,catch那些Exception更合适,报错信息更能快速定位问题所在... 转载链接← 正文 Exception: 所有异常对象的基类. SystemExce ...
- 自定义Exception异常
自定义异常构建 首先写一个自定义异常,继承Exception,代码如下 public class NoMappingParamString extends Exception { /*无参构造函数*/ ...
随机推荐
- (转载)SQL Server 2005 如何启用xp_cmdshell组件
原文地址:http://www.cnblogs.com/atree/p/SQL_SERVER_xp_cmdshell.html [错误描述]: SQL Server阻止了对组件‘xp_cmdshell ...
- 解决Windows8下Cisco Systems VPN Client的Reason 442: Failed to Enable Virtual Adapter错误
Windows8下使用Cisco Systems VPN Client创建的Cisco IPSec VPN无法连接,提示Reason 442: Failed to Enable Virtual Ada ...
- Jmeter组件4. Regular Expression Extractor
位置:Post-Processors - Regular Expression Extractor 所谓的Post-Processors直译为后处理器,意思是在域内所有Sampler执行完后才会执行, ...
- android 实现桌面显示内容
//获取windowmanager 对象 WindowManager wm = (WindowManager) getApplicationContext().getSystemService(WIN ...
- Spring mvc 配置详解
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...
- Spring MVC入门知识总结
2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职 ...
- 深入理解JS异步编程四(HTML5 Web Worker)
>Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由web Worker运行而不冻结用户界面. 一:如何使用Worker We ...
- 解决Django和EasyUI搭配使用时出现的CSRF问题
在<head></head>中添加以下代码即可: <script type="text/javascript"> $.ajaxSetup({ d ...
- 线程池的使用ExecutorService
private ExecutorService executorService = Executors.newFixedThreadPool(5); // 引入线程池来管理多线程 private vo ...
- 3.openssl speed和openssl rand
(1).openssl speed 测试加密算法的性能. 支持的算法有: openssl speed [md2] [mdc2] [md5] [hmac] [sha1] [rmd160] [idea-c ...