当前位置:网站首页 > Java基础 > 正文

零基础java艺立



异常机制

什么是异常

  • 实际工作中,遇到的情况不可能是完美的。比如:你写的某个模块,用户输入不一定符号你的要求,你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了等等。

  • 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理,而不至于程序崩溃。

  • 异常指程序运行中出现的不期而至的各种状况,如:文件找不到,网络连接失败,非法参数等。

  • 异常发生在程序运行期间,它影响了正常的程序执行流程。

简单分类

  • 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

    • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法遇见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单的忽略。

    • 异常处理框架!

    • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

    • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到的。

异常体系结构

  • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

  • 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception

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 

错误或警告

                                 java编程艺立教育专注培训多年,经验丰富                             广告                                         java编程软件编程+项目实战教学,教学水平高,轻松就业,提供定制化培训方案                                         查看详情 >                                    

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类即可。

  • 在程序中使用自定义异常类,大体可分为以下几个步骤:

    1. 创建自定义异常类。

    2. 在方法中通过throw关键字抛出异常对象。

    3. 如果在抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

    4. 在出现异常方法的调用者中捕获并处理异常。

 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:异常的打印信息
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}

实际应用中的经验总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

  • 在多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常

  • 对于不确定的代码,也可以加上try-catch,处理潜在的异常

  • 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出

  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定

  • 上一篇: java程序设计基础实验教程
  • 下一篇: java基础学完书

版权声明


相关文章:

  • java程序设计基础实验教程2024-10-17 13:26:02
  • java基础坐Java Swing的层次结构深入理解2024-10-17 13:26:02
  • java数组的基础2024-10-17 13:26:02
  • java基础小项目实例2024-10-17 13:26:02
  • java基础封装概念和实例2024-10-17 13:26:02
  • java基础学完书2024-10-17 13:26:02
  • java面试被认为基础不好2024-10-17 13:26:02
  • java面试题基础测试2024-10-17 13:26:02
  • java 基础知识面试2024-10-17 13:26:02
  • java基础多线程讲解2024-10-17 13:26:02