什么是异常
-
实际工作中,遇到的情况不可能是完美的。比如:你写的某个模块,用户输入不一定符号你的要求,你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了等等。
-
软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理,而不至于程序崩溃。
-
异常指程序运行中出现的不期而至的各种状况,如:文件找不到,网络连接失败,非法参数等。
-
异常发生在程序运行期间,它影响了正常的程序执行流程。
简单分类
-
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
-
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法遇见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略。
-
异常处理框架!
-
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
-
错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到的。
-
异常体系结构
-
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
-
在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception
史上最全的Java中所有Exception异常中英文对照
AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会
抛出该异常
ActivationException,激活异常
AlreadyBoundException, 试图将注册表中的对象绑定到已具有相关绑定
的名称上
ApplicationException, 报告 ORB 和 stub 之间的应用程序级异常
ArithmeticException 算数异常
ArrayIndexOutOfBoundsException 数组下标越界
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常
AWTException, 发生了 Absract Window Toolkit 异常
BackingStoreException, 由于内部存储故障或者不能联系内部存储而无法完成 preferences 操作
BadAttributeValueExpException,向构造的查询方法传递无效的
MBean 属性时,抛出此异常
BadBinaryOpValueExpException, 向构造查询的方法传递无效的表达式时,抛出此异常
BadLocationException, 报告文档模型中的损坏位置(即试图引用
一个不存在的位置)
BadStringOperationException, 向构造查询的方法传递无效的字符
串操作时,抛出此异常
BrokenBarrierException, 当某个线程试图等待处于断开状态的barrier 时,或者 barrier 进入断开状态而线程处于等待状态时,抛出该异常
CertificateException, 指示各种证书问题之一
ClassNotFoundException, 找不到类
CloneNotSupportedException, 不支持克隆
DataFormatException, 当数据格式发生错误时,抛出此异常
DatatypeConfigurationException, 指示严重的配置错误
DestroyFailedException, 当destroy操作失败时,抛出此异常
ExecutionException, 当试图获取已通过抛出异常而中止的任务的 结果时,抛出此异常
ExpandVetoException, 用于阻止扩展/折叠发生的异常
FontFormatException, 此异常由Font类中的createFont 方 法抛出,以指示指定的字体很糟糕
GeneralSecurityException, 一般安全异常类,可以为所有从其扩展 的与安全有关的异常类提供类型安全
GSSException, 每当发生
GSS-API 错误(包括任何特定于机制的 错误)时,都会抛出此异常
IllegalAccessException, 没有访问权限
IllegalClassFormatException, 输入参数无效
InstantiationException, 当应用程序试图使用Class类中的newInstance方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
InterruptedException, 被终止异常
IntrospectionException, 在Introspection期间发生异常时抛出异常
InvalidApplicationException, 试图应用下列任一内容时抛出此异
常
InvalidMidiDataException, 此数据在使用它的环境中无效,或者接 收此数据的对象无法解析或使用它
InvalidPreferencesFormatException,输入内容不符合preferences集的正确XML文档类型,从而无法完成操作
InvalidTargetObjectTypeException, 当指定了无效的目标对象类型时,抛出此异常
InvocationTargetException, 由调用方法或构造方法所抛出异常的经过检查的异常
IOException,当发生某种I/O异常时,抛出此异常
JAXBException,这是所有JAXB异常的根异常类
JMException,由JMX实现所抛出的异常。它不包括运行时异常
KeySelectorException,指示由KeySelector抛出的异常条件
LastOwnerException, 如果试图删除访问控制列表的最后一个所有者,则抛出此异常
LineUnavailableException,某一行因为不可用而无法打开的异常
MarshalException,指示XML编组或解组过程中发生的异常条件
MidiUnavailableException, 当请求的MIDI组件由于不可用而无法打开或创建时,抛出
MimeTypeParseException,对分析相关异常的MimeType进行封装的类
MimeTypeParseException,封装与MimeType解析相关的异常的类
NamingException,此异常是Context和DirContext接口中的操作抛出的所有异常的超类
NoninvertibleTransformException,表示在执行的操作要求AffineTransform对象可逆但AffineTransform
处于不可逆状态时抛出的异常
NoSuchFieldException,属性不存在异常
NoSuchMethodException,方法未找到
NotBoundException,如果试图在注册表中查找或解绑没有相关绑定的名称,则抛出
NotOwnerException,当只允许对象(如访问控制列表)的所有者修改对象,但是试图进行修改的Principal
不是所有者时,抛出此异常
ParseException,表示解析时出现意外错误
ParserConfigurationException,指示一个严重的配置错误
PrinterException,PrinterException类及其子类用于指示打印系统中发生的异常情况
PrintException,类PrintException封装了与打印有关的错误状况,此状况在使用PrintService实例时会发生
PrivilegedActionException,指示执行的操作抛出了经过检查的异常
PropertyVetoException, 当某一属性的提议更改表示一个不可接
受的值时,将抛出
RefreshFailedException
,
当
refresh
操作失败时,抛出此异常
RemarshalException
,
此类用来报告本地转发异常,以及发回
ORB
的对象转发
GIOP
信息
RuntimeException
,
在
Java
虚拟机正常运行期间抛出的异常的超
类
SAXException
,
封装一般的
SAX
错误或警告
ScriptException
,
由底层脚本实现抛出的经过检查的异常类型必
须包装在
ScriptException
的实例中
ServerNotActiveException
,
如果在服务于远程方法调用之外调用
getClientHost
方法,则
ServerNotActiveException
是在调
用
RemoteServer.getClientHost
的过程中抛出的
Exception
SOAPException
,
当发生
SOAP
异常时,抛出此异常
SQLException
,
提供关于数据库访问错误或其他错误信息的异常
TimeoutException
,
阻塞操作超时时,抛出该异常
TooManyListenersException
,
用作
Java Event
模型的一部分来注
释和实现多播
Event Source
的单播特例
TransformerException
,
此类指定了转换过程中发生的异常条件
TransformException
,
指示执行转换算法时出现异常的异常条件
UnmodifiableClassException
,
无法修改指定类之一时
UnsupportedAudioFileException
,
因为文件没有包含可识别文件类
型和格式的有效数据而致使操作失败的异常
UnsupportedCallbackException
,
在
CallbackHandler
不能识别特
定的
Callback
时发出的信号
UnsupportedFlavorException
,
在此
flavor
中不支持所请求的数
据的信号
UnsupportedLookAndFeelException
,
指示在用户系统上不存在请求
的外观管理类的异常
URIReferenceException
,
指示取消引用
URIReference
时抛出的
异常条件
URISyntaxException
,
抛出经过检查的指示字符串不能解析为
URI
引用的异常
UserException
,
CORBA IDL
定义的用户异常的根类。所有
CORBA
用户异常都是经过检查的异常,这意味着它们需要在方法签名中
被声明
XAException
,
资源管理器
(RM)
抛出
XAException
,以通知事务
管理器涉及的事务遇到错误
XMLParseException
,
当将某个
XML
格式的字符串解析为
ModelMBean
对象,或从
ModelMBean
对象创建
XML
格式的字符
串时,抛出此异常
XMLSignatureException
,
指示生成或验证
XML
签名过程中发生的
异常条件
XMLStreamException
,
用于不可预料处理错误的基本异常
XPathException
XPathException
表示通用
XPath
异常
错误
AnnotationFormatError
,
当注释解析器试图从类文件读取注释并
确定注释出现异常时,抛出该错误
AssertionError
,
断言错,用来指示一个断言失效的情况
AWTError
,
当发生严重的
Abstract Window Toolkit
错误时,抛
出此错误
CoderMalfunctionError
,
当
CharsetDecoder
的
decodeLoop
方
法,或
CharsetEncoder
的
encodeLoop
方法抛出不可预料的
异常时抛出的错误
FactoryConfigurationError
,
当解析器工厂的配置存在问题时抛出
该异常
FactoryConfigurationError
,
一个用于报告工厂配置错误的错误类
IOError
,
输入输出异常
LinkageError
,
指示一个类在一定程度上依赖于另一个类;但是,
在编译前一个类之后,后一个类发生了不相容的改变
ServiceConfigurationError
,
在加载服务提供者的过程中出错时抛
出的错误
ThreadDeath
,
调用
Thread
类中带有零参数的
stop
方法时,
受害线程将抛出一个
ThreadDeath
实例,仅当应用程序在被异
步终止后必须清除时才应该捕获这个类的实例
TransformerFactoryConfigurationError
,
当通过
Transformer
Factories
进行的配置存在问题时抛出此异常
VirtualMachineError
当
Java
虚拟机崩溃或用尽了它继续操作所
需的资源时,抛出该错误
查看全部包含“Java中所有Exception异常中英文对照 AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会 抛出该异常ActivationException,激活异常AlreadyBoundException, 试图将注册表中的对象绑定到已具有相关绑定的名称上ApplicationException, 报告 ORB 和 stub 之间的应用程序级异常ArithmeticException 算数异常ArrayIndexOutOfBoundsException 数组下标越界 ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常 AWTException, 发生了 Absract Window Toolkit 异常 BackingStoreException, 由于内部存储故障或者不能联系内部存储而无 法完成 preferences 操作 BadAttributeValueExpException, 向构造的查询方法传递无效的 MBean 属性时,抛出此异常 BadBinaryOpValueExpException, 向构造查询的方法传递无效的表 达式时,抛出此异常 BadLocationException , 报告文档模型中的损坏位置(即试图引用 一个不存在的位置) BadStringOperationException, 向构造查询的方法传递无效的字符 串操作时,抛出此异常 BrokenBarrierException, 当某个线程试图等待处于断开状态的barrier 时,或者 barrier 进入断开状态而线程处于等待状态时, 抛出该异常 CertificateException, 指示各种证书问题之一ClassNotFoundException, 找不到类CloneNotSupportedException, 不支持克隆DataFormatException, 当数据格式发生错误时,抛出此异常DatatypeConfigurationException, 指示严重的配置错误DestroyFailedException零基础java艺立, 当destroy操作失败时,抛出此异常”的文档
Error
-
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
-
Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;
-
还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError),链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理范围之外,并且绝大多数是程序运行时不允许出现的状况。
Exception
-
在Exception分支中有一个重要的子类RuntimeException(运行时异常)
-
ArrayIndexOutOfBoundsException(数组下标越界)
-
NullPointerException(空指针异常)
-
ArithmeticException(算术异常)
-
MissingResourceException(丢失资源)
-
ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
-
-
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生;
-
Error和Exception的区别:Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
package exception;
public class Dome01 {
public static void main(String[] args) {
new Dome01().a();
}
//Exception in thread "main" java.lang.StackOverflowError
public void a(){
b();
}
public void b(){
a();
}
}
Exception in thread "main" java.lang.StackOverflowError
package exception;
public class Dome02 {
public static void main(String[] args) {
//Exception in thread "main" java.la
// ng.ArithmeticException: / by zero
//Arithmetic算术
System.out.println((11 / 0));
}
}
package exception;
public class Dome03 {
public static void main(String[] args) {
//Error:(5, 29) java: 需要';'
//System.out.println()
}
}
异常处理机制
-
抛出异常
-
捕获异常
-
异常处理五个关键字
-
try,catch,finally,throw,throws
-
package exception1026.Dome01;
//用了try catch即使抛出异常了仍可以继续运行
public class Text2 {
public static void main(String[] args) {
new Text2().test(1,0);
}
//假设这个方法处理不了这个异常。在方法上抛出异常
//throw是制造异常,throws是抛出异常
public void test(int a,int b) throws ArithmeticException{
if (b == 0) {
//主动抛出异常 throw
//一般在方法中使用
//它什么都没有做
throw new ArithmeticException();
}
//System.out.println(a / b);
}
}
// //选中要实验的代码 Ctrl + Alt +T
// try {
// System.out.println(a / b);
// } catch (Exception e) {
//
// //这里证明了try-->catch-->fially这样的顺序执行的
// //System.exit(0);//程序直接结束了
// e.printStackTrace();//打印错误的栈信息
// } finally {
// System.out.println("Hello World");
// }
package exception1026.Dome01;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
//一个try可以有多个catch
//假设要捕获多个异常,从小到大!
try{//try监控区域
System.out.println(a / b);
}catch (Error error){//catch(想要捕获的异常类型!)捕获异常
System.out.println("error");
}catch (Exception exception) {
System.out.println("exception");
//}catch (Exception exception){//直接报错
}catch (Throwable throwable){
System.out.println("throwable");
}finally {//处理善后工作
System.out.println("finally");
}
//finally在异常报错之前出现
//finally可以不要finally,假设I/O,资源,关闭!
}
public void a(){
b();
}
public void b(){
a();
}
}
自定义异常
-
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此以外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
-
在程序中使用自定义异常类,大体可分为以下几个步骤:
-
创建自定义异常类。
-
在方法中通过throw关键字抛出异常对象。
-
如果在抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
-
在出现异常方法的调用者中捕获并处理异常。
-
package exception1026.Dome02;
//可能会存在异常的方法
public class ApplicationMyException {
static void test(int a) throws MyException{
System.out.println("传递的参数为:" + a);
if (a > 10){
throw new MyException(a);//抛出
}
System.out.println("OK");
}
//方法二 捕获
// static void test(int a){
// if (a > 10){
// try {
// throw new MyException(a);
// } catch (MyException e) {
// e.printStackTrace();
// }
// }
// }
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
//e.printStackTrace();
System.out.println("MyException=>" + e);
}
}
}
package exception1026.Dome02;
//自定义异常
public class MyException extends Exception{
//传递数字 > 10;
private int detail;
public MyException(int a){
this.detail = a;
}
//toString:异常的打印信息
实际应用中的经验总结
-
处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
-
在多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常
-
对于不确定的代码,也可以加上try-catch,处理潜在的异常
-
尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
-
具体如何处理异常,要根据不同的业务需求和异常类型去决定
-
- 上一篇: java程序设计基础实验教程
- 下一篇: java基础学完书
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/26030.html