Java第8章异常处理与断言.ppt

上传人:max****ui 文档编号:6357574 上传时间:2020-02-23 格式:PPT 页数:75 大小:392.55KB
返回 下载 相关 举报
Java第8章异常处理与断言.ppt_第1页
第1页 / 共75页
Java第8章异常处理与断言.ppt_第2页
第2页 / 共75页
Java第8章异常处理与断言.ppt_第3页
第3页 / 共75页
点击查看更多>>
资源描述
第8章异常处理与断言 内容提要 异常是在程序运行过程中产生的使程序终止正常运行的事件 是一种特殊的运行对象 本章要点 本章首先介绍什么是异常 异常的类型以及如何处理异常 其中包括运行时异常和非运行时异常 使用try catch处理异常 声明方法抛出异常 try with resources语句的使用以及创建自定义的异常 最后 简单介绍了有关断言的概念 8 1异常与异常类 8 1 1异常的概念8 1 2Throwable类及其子类 8 1 1异常的概念 所谓异常 exception 是在程序运行过程中产生的使程序终止正常运行的错误对象 如数组下标越界 整数除法中零作除数 文件找不到等都可能使程序终止运行 为了理解异常的概念 首先看下面的程序 8 1 1异常的概念 程序8 1NullPointerDemo java publicclassNullPointerDemo publicstaticvoidmain String args Circlecircle null System out println circle area System out println Programfinished 该程序编译不会发生错误 可以生成NullPointerDemo class字节码文件 但运行时结果如下 Exceptioninthread main java lang NullPointerExceptionatNullPointerDemo main NullPointerDemo java 4 8 1 1异常的概念 该输出内容说明程序发生了异常 第一行给出了异常名称 第二行给出了异常发生的位置 Java语言规定当某个对象的引用为null时 调用该对象的方法或使用对象时就会产生NullPointerException异常 该程序中当调用circle的area 方法时 运行时系统产生了一个NullPointerException异常类对象并抛出 运行时系统就在产生异常对象的方法中寻找处理该异常对象的代码 若有则进入异常处理的代码 若没有 如本程序 运行时系统继续将异常对象抛给调用该方法的方法 由于main 方法是由JVM调用的 所以将异常抛给了JVM JVM在标准输出设备上输出异常的名称 8 1 1异常的概念 再看下面一个程序 该程序试图从键盘上输入一个字符 然后输出 程序8 2InputChar javaimportjava io publicclassInputChar publicstaticvoidmain String args System out print Inputachar charc char System in read System out println c c 8 1 1异常的概念 当编译该程序时会出现下列编译错误 UnhandledexceptiontypeIOException上述编译错误说明程序没有处理IOException异常 该异常必须捕获或声明抛出 同时编译器指出了需要捕获异常的位置 出现上述编译错误的原因是 read 方法在定义时声明抛出了IOException异常 因此程序中若调用该方法必须声明抛出异常或捕获异常 8 1 2Throwable类及其子类 Java语言的异常处理采用面向对象的方法 为各种异常建立了类层次 Java异常都是Throwable类的子类对象 Throwable类是Object类的直接子类 它定义在java lang包中 Throwable类有两个子类一个是Error类另一个是Exception类 这两个子类又分别有若干个子类 8 1 2Throwable类及其子类 1 Error类Error类描述的是系统内部错误 这样的错误很少出现 如果发生了这类错误 则除了通知用户及终止程序外 几乎什么也不能做 程序中一般不对这类错误处理 Exception类图8 1给出了Exception类及其常见子类的层次结构 Exception类的子类一般又可分为两种类型 运行时异常和非运行时异常 8 1 2Throwable类及其子类 图8 2RuntimeException类及其子类 图8 1Exception类及其子类的层次 8 1 2Throwable类及其子类 1 运行时异常RuntimeException类及其子类异常称为运行时异常 常见的运行时异常如图8 2所示 运行时异常是在程序运行时检测到的 可能发生在程序的任何地方且数量较大 因此编译器不对运行时异常 包括Error类的子类 处理 这种异常又称为免检异常 uncheckedexception 但程序运行时发生这种异常时运行时系统会把异常对象交给默认的异常处理程序 在控制台显示异常的内容及发生异常的位置 程序8 1中的异常NullPointerException就是运行时异常 8 1 2Throwable类及其子类 下面介绍几种常见的运行时异常 NullPointerException空指针异常 即当某个对象的引用为null时调用该对象的方法或使用对象时就会产生该异常 如 inta null a 0 0 该语句发生异常ArithmeticException算术异常 在做整数的除法或整数求余运算时可能产生的异常 它是在除数为零时产生的异常 inta 5 intb a 0 该语句发生异常注意 浮点数运算不会产生该类异常 如 1 0 0 0的结果为Infinity 8 1 2Throwable类及其子类 ClassCastException对象转换异常 Java支持对象类型转换 若不符合转换的规定 则产生类转换异常 例如 Objecto newObject Strings String o 该语句发生异常ArrayIndexOutOfBoundsException数组下标越界异常 当引用数组元素的下标超出范围时产生的异常 例如 inta newint 5 a 5 10 该语句发生异常因为定义的数组a的长度为5 不存在a 5 这个元素 因此发生数组下标越界异常 8 1 2Throwable类及其子类 NumberFormatException数字格式错误异常 在将字符串转换为数值时 如果字符串不能正确转换成数值则产生该异常 例如 doubled Double parseDouble 5m7 8 该语句发生异常异常的原因是字符串 5m7 8 不能正确转换成double型数据 注意 尽管对运行时异常可以不处理 但程序运行时产生这类异常 程序也不能正常结束 为了保证程序正常运行 要么避免产生运行时异常 要么对运行时异常进行处理 8 1 2Throwable类及其子类 2 非运行时异常除RuntimeException类及其子类以外的类称为非运行时异常 有时也称为必检异常 checkedexception 对这类异常 程序必须捕获或声明抛出 否则编译不能通过 程序8 2中的异常IOException就是非运行时异常 再比如 若试图使用Java命令运行一个不存在的类 则会产生ClassNotFoundException异常 若调用了一个不存在的方法 则会产生NoSuchMethodException异常 8 2异常处理机制 8 2 1异常的抛出与捕获8 2 2try catch finally语句8 2 3用catch捕获多个异常8 2 4声明方法抛出异常8 2 5用throw语句抛出异常8 2 6try with resources语句 8 2异常处理机制 异常处理可分为下面几种 使用try catch finally捕获并处理异常 通过throws子句声明抛出异常 用throw语句抛出异常 使用try with resources管理资源 8 2 1异常的抛出与捕获 在Java程序中 异常都是在方法中产生的 方法运行过程中如果产生了异常 在这个方法中就生成一个代表该异常类的对象 并把它交给运行时系统 运行时系统寻找相应的代码来处理这一异常 生成异常对象并把它交给运行时系统的过程称为抛出异常 运行时系统在方法的调用栈中查找 从产生异常的方法开始进行回溯 直到找到包含相应异常处理的方法为止 这一过程称为捕获异常 8 2 1异常的抛出与捕获 方法调用与回溯如图8 3所示 图8 3方法调用与回溯示意图 这里main 方法调用了methodA 方法 methodA 方法调用了methodB 方法 methodB 方法调用了methodC 方法 假如在methodC 方法发生异常 运行时系统首先在该方法中寻找处理异常的代码 如果找不到 运行时系统将在方法调用栈中回溯 把异常对象交给methodB 方法 如果methodB 方法也没有处理异常代码 将继续回溯 直到找到处理异常的代码 最后 如果main 方法中也没有处理异常的代码 运行时系统将异常交给JVM JVM将在控制台显示异常信息 8 2 2try catch finally语句 在Java程序中捕获并处理异常最常用的方法是用try catch finally语句 该结构的一般格式为 try 需要处理的代码 catch ExceptionType1exceptionObject 异常处理代码 catch ExceptionType2exceptionObject 异常处理代码 finally 最后处理代码 8 2 2try catch finally语句 说明 1 try块将程序中可能产生异常的代码段用大括号括起来 该块内可能抛出一种或多种异常 2 catch块用来捕获异常 括号中指明捕获的异常类型及异常引用名 类似于方法的参数 它指明了catch语句所处理的异常 大括号中是处理异常的代码 catch语句可以有多个 用来处理不同类型的异常 注意 若有多个catch块 异常类型的排列顺序必须按照从特殊到一般的顺序 即子类异常放在前面 超类异常放在后面 否则产生编译错误 8 2 2try catch finally语句 当try块中产生异常 运行时系统从上到下依次检测异常对象与哪个catch块声明的异常类相匹配 若找到匹配的或其父类异常 既进入相应catch块处理异常 catch块执行完毕说明异常得到处理 3 finally块是可选项 异常的产生往往会中断应用程序的执行 而在异常产生前 可能有些资源未被释放 有时无论程序是否发生异常 都要执行一段代码 这时就可以通过finally块实现 无论异常产生与否finally块都会被执行 即使是使用了return语句 finally块也要被执行 除非catch块中调用了System exit 方法终止程序的运行 8 2 2try catch finally语句 另外需要注意 一个try块必须有一个catch块或finally块 catch块或finally块也不能单独使用 必须与try块搭配使用 下面使用try catch结构捕获并处理一个ArithmeticException异常 8 2 2try catch finally语句 程序8 3DivideDemo javapublicclassDivideDemo publicstaticvoidmain String args inta 5 try intb a 0 System out println b b catch ArithmeticExceptione e printStackTrace System out println a a 8 2 2try catch finally语句 程序运行结果为 java lang ArithmeticException byzeroatDemo main Demo java 5 a 5从上述结果可以看到 程序运行中发生的异常得到了处理 接下来程序继续运行 程序中调用了异常对象的printStackTrace 方法 它从控制台输出异常栈跟踪 从栈跟踪中我么可以了解到发生的异常类型和发生异常的源代码的行号 8 2 2try catch finally语句 在异常类的根类Throwable中还定义了其他方法 如下所示 publicvoidprintStackTrace 在标准错误输出流上输出异常调用栈的轨迹 publicStringgetMessage 返回异常对象的细节描述 publicStringgetLocalizedMessage 返回异常对象的针对特定语言的细节描述 publicvoidprintStackTrace PrintStreams 在指定输出流上输出异常调用栈的轨迹 8 2 2try catch finally语句 publicvoidprintStackTrace PrintWriters 在指定输出流上输出异常调用栈的轨迹 publicStringtoString 返回异常对象的简短描述 是Object类中同名方法的覆盖 这些方法被异常子类所继承 可以调用异常对象的方法获得异常的有关信息 这可使程序调试方便 有关其他方法的详细内容 请参阅JavaAPI文档 下面是对程序8 2的修改 使用try catch结构捕获异常 8 2 2try catch finally语句 程序8 4InputCharDemo javaimportjava io publicclassInputCharDemo publicstaticvoidmain String args System out print 请输入一个字符 try charc char System in read System out println c c catch IOExceptione e printStackTrace 8 2 2try catch finally语句 注意 catch块中的异常可以是超类异常 另外catch块中可以不写任何语句 只要有一对大括号 系统就认为异常被处理了 程序编译就不会出现错误 编译后程序正常运行 catch块内的语句只有在真的产生异常时才被执行 下面程序涉及多个异常的捕获和处理 8 2 2try catch finally语句 程序8 5MultiExceptionDemo java 程序的输出如下 无异常发生 执行finally块 0捕获到 java lang ArithmeticException byzero执行finally块 1捕获到 java lang ArrayIndexOutOfBoundsException 4执行finally块 2 8 2 3用catch捕获多个异常 如前所述 一个try语句后面可以跟两个或多个catch语句 虽然每个catch语句经常提供自己的特有的代码序列 但是有时捕获异常的两个或多个catch语句可能执行相同的代码序列 现在可以使用JDK7提供的一个新功能 用一个catch语句处理多个异常 而不必单独捕获每个异常类型 这就减少了代码重复 要在一个catch语句中处理多个异常 需要使用 或 运算符 分隔多个异常 下面的程序演示了捕获多个异常的方法 8 2 3用catch捕获多个异常 程序8 6MultiCatchDemo java 8 2 3用catch捕获多个异常 程序运行当尝试除以0时 将产生一个ArithmeticException错误 当尝试越界访问letter数组时 将产生一个ArrayIndexOutOfException错误 两个异常被同一个catch语句捕获 注意 多重捕获的每个形参隐含地为final 所以不能为其赋新值 8 2 4声明方法抛出异常 所有的异常都产生在方法 包括构造方法 内部的语句 有时方法中产生的异常不需要在该方法中处理 可能需要由该方法的调用方法处理 这时可以在声明方法时用throws子句声明抛出异常 将异常传递给调用该方法的方法处理 声明方法抛出异常的格式如下 returnTypemethodName paramlist throwsExceptionList 方法体 8 2 4声明方法抛出异常 按上述方式声明的方法 就可以对方法中产生的异常不作处理 若方法内抛出了异常 则调用该方法的方法必须捕获这些异常或者再声明抛出 上面的例子是在method 方法中处理异常 若不在该方法中处理异常 而由调用该方法的main 方法处理 程序修改如下 8 2 4声明方法抛出异常 程序8 7ThrowsExceptionDemo java 该程序的输出结果为 8 2 4声明方法抛出异常 注意 对于运行时异常可以不做处理 对于非运行时异常必须使用try catch结构捕获或声明方法抛出异常 前面讲到子类可以覆盖超类的方法 但若超类的方法使用throws声明抛出了异常 子类方法也可以使用throws声明异常 但是要注意 子类方法抛出的异常必须是超类方法抛出的异常或子异常 8 2 4声明方法抛出异常 classAA publicvoidtest throwsIOException System out println InAA stest classBBextendsAA publicvoidtest throwsFileNotFoundException 允许System out println InBB stest classCCextendsAA publicvoidtest throwsException 错误System out println InCC stest 8 2 4声明方法抛出异常 代码中BB类的test 方法是对AA类test 方法的覆盖 它抛出了FileNotFoundException异常 因为该异常是IOException异常类的子类 这是允许的 而在CC类的test 中抛出了Exception异常 该异常是IOException异常类的父类 这是不允许的 不能通过编译 8 2 5用throw语句抛出异常 到目前为止 处理的异常都是由程序产生的 并由程序自动抛出 然而也可以创建一个异常对象 然后用throw语句抛出 或者将捕获到的异常对象用throw语句再次抛出 throw语句的格式如下 throwthrowableInstance throwableInstance可以是用户创建的异常对象 也可以是程序捕获到的异常对象 该实例必须是Throwable类或其子类的实例 请看下面例子 8 2 5用throw语句抛出异常 程序8 9ThrowExceptionDemo javaimportjava io IOException publicclassThrowExceptionDemo publicstaticvoidmethod throwsIOException try thrownewIOException filenotfound catch IOExceptione System out println caughtinsidemethod throwe 将捕获到的异常对象再次抛出 8 2 5用throw语句抛出异常 publicstaticvoidmain String args try method catch IOExceptione System out println recaught e 8 2 5用throw语句抛出异常 程序的输出结果为 caughtinsidemethodrecaught java io IOException filenotfound上述程序在method 方法中try块中用new创建一个异常对象并将其抛出 随后在catch块中捕获到该异常 然后又再次将该异常抛给main 方法 在main 方法的catch块中捕获并处理了该异常 请注意 该程序在method 方法需使用throws声明方法抛出IOException异常 因为该异常是非运行时异常 必须捕获或声明抛出 在main 方法也必须使用try catch捕获和处理异常 8 2 6try with resources语句 Java程序中经常需要创建一些对象 如I O流 数据库连接 这些对象在使用完后需要关闭 忘记关闭文件可能导致内存泄露 并引起其他问题 在JDK7之前 通常使用finally语句来确保一定会调用close 方法 try 打开资源 catch Exceptione finally 关闭资源 8 2 6try with resources语句 如果在调用close 方法也可能抛出异常 那么也要处理这种异常 这样编写的程序代码会变得冗长 例如 下面是打开一个数据库连接的典型代码 Connectionconnection null try 创建连接对象并执行操作 catch Exceptione finally if connection null try connection close catch SQLExceptione 8 2 6try with resources语句 可以看到 为了关闭连接资源要在finally块中写这些代码 如果在一个try块中打开多个资源 代码会更长 JDK7提供的自动关闭资源的功能为管理资源 如文件流 数据库连接等 提供了一种更加简便的方式 这种功能是通过一种新的try语句实现的 叫try with resources 有时称为自动资源管理 try with resources的主要好处是可以避免在资源 如文件流 不需要时忘记将其关闭 8 2 6try with resources语句 try with resources语句的基本形式如下 try resource specification 使用资源 这里 resource specification是声明并初始化资源 如文件 的语句 它包含变量声明 用被管理的对象的引用初始化该变量 这里可以创建多个资源 用分号分隔即可 当try块结束时 资源会自动释放 8 2 6try with resources语句 如果是文件 文件将被关闭 因此不需要显式调用close 方法 try with resources语句也可以不包含catch语句和finally语句 8 2 6try with resources语句 并非所有的资源都可以自动关闭 只有实现了java lang AutoCloseable接口的那些资源才可自动关闭 该接口是JDK7新增的 它定义了close 方法 java io Closeable接口继承了AutoCloseable接口 这两个接口被所有的流类实现 包括FileInputStream和FileOutputStream 因此 在使用流 包括文件流 时 可以使用try with resources语句 下面的例子演示了try with resources语句的使用 8 2 6try with resources语句 程序8 10TryWithResources java 8 2 6try with resources语句 程序定义了Door类和Window类 它们都实现了java langAutoClosable接口的close 方法 此外 还定义了open 方法 在open 方法中使用throw抛出了异常 在程序的main 方法中使用了try with resources语句创建了door对象和window对象 这两个对象就是可自动关闭的资源 在调用door open 方法时抛出异常 程序控制转到异常处理代码 在此之前 程序调用两个资源的close 方法将door和window关闭 然后才处理异常 8 3自定义异常类 尽管Java已经预定义了许多异常类 但有时还需要定义自己的异常 这时只需要继承Exception类或其子类就可以了 程序8 11MyException javapublicclassMyExceptionextendsException privateintnum MyException inta num a publicStringtoString return MyException num 8 3自定义异常类 下面的程序中使用了自定义的类MyException程序8 12ExceptionExample javapublicclassExceptionExample staticvoidmakeexcept inta throwsMyException System out println calledmakeexcept a if a 0 thrownewMyException a System out println exitwithoutexception 8 3自定义异常类 publicstaticvoidmain String args try makeexcept 5 makeexcept 0 catch MyExceptione System out println caught e 8 3自定义异常类 程序的输出为 calledmakeexception 5 exitwithoutexceptioncalledmakeexception 0 caught MyException 0 8 4断言机制 断言是Java1 4版新增的一个特性 并在该版本中增加了一个关键字assert 断言功能可以被看成是异常处理的高级形式 所谓断言 assertion 是一个Java语句 其中指定一个布尔表达式 程序员认为在程序执行时该表达式的值应该为true 系统通过计算该布尔表达式执行断言 若该表达式为false系统会报告一个错误 通过验证断言是true 能够使程序员确信程序的正确性 8 4 1断言概述 断言是通过assert关键字来声明的 断言的使用有两种格式 assertexpression assertexpression detailMessage 在上述语句中 expression为布尔表达式 detailMessage是基本数据类型或Object类型的值 当程序执行到断言语句时 首先计算expression的值 如果其值为true 什么也不做 如果其值为false 抛出AssertionError异常 8 4 1断言概述 AssertionError类有一个默认的构造方法和7个重载的构造方法 它们有一个参数 类型分别为 int long float double boolean char和Object 对于第一种断言语句没有详细信息 Java使用AssertionError类默认的构造方法 对于第二种带有一个详细信息的断言语句 Java使用AssertionError类的与消息的数据类型匹配的构造方法 由于AssertionError类是Error类的子类 当断言失败时 expression的值为false 程序在控制台显示一条消息并终止程序的执行 下面是一个使用断言的例子 8 4 1断言概述 程序8 13AssertionDemo javapublicclassAssertionDemo publicstaticvoidmain String args inti intsum 0 for i 0 i10 8 4 1断言概述 程序中语句asserti 10 断言i的值为10 如果i的值不为10将抛出AssertionError异常 语句assertsum 10断言sum大于10且小于50 如果为false 将抛出带有消息 sumis sum的AssertionError异常 假如现在错误地输入了i 100而不是i 10 就会抛出下面的AssertionError异常 Exceptioninthread main java lang AssertErroratAssertionDemo main AssertionDemo java 8 假如将sum sum i错误地输入了sum sum 1 就会抛出下面的AssertionError异常 Exceptioninthread main java lang AssertError sumis10atAssertionDemo main AssertionDemo java 9 8 4 2启动和关闭断言 编译带有断言的程序与一般程序相同 如下所示 D study javacAssertionDemo java默认情况下 断言机制在运行时是关闭的 要打开断言功能 在运行程序时需要使用 enableassertions或 ea选项 例如 D study java eaAssertionDemo断言还可以在类的级别或包的级别打开或关闭 关闭断言的选项为 disableassertions或 da 例如 下面的命令在包package1的级别打开断言 而在Class1类上关闭断言 D study java ea package1 da Class1AssertionDemo 8 4 3何时使用断言 断言的使用是一个复杂的问题 因为这将涉及程序的风格 断言运用的目标 程序的性质等 通常来说 断言用于检查一些关键的值 并且这些值对整个应用程序或局部功能的实现有较大影响 并且当断言失败 这些错误是不容易恢复的 以下是一些使用断言的情况 它们可以使Java程序的可靠性更高 8 4 3何时使用断言 1 检查控制流在if else和switch case结构中 可以在不应该发生的控制支流上加上assertfalse语句 如果这种情况发生了 断言就能够检查出来 例如 假设x的值只能取1 2或3 可以编写下面的代码 switch x case1 case2 case3 default assertfalse xvalueisinvalid x 8 4 3何时使用断言 2 检查前置条件 precondition 在private修饰的方法前检查输入参数是否有效 对于一些private方法 如果要求输入满足一定的条件 可以在方法的开始处使用assert进行参数检查 对于public方法一般不使用assert进行检查 因为public方法必须对无效的参数进行检查和处理 例如 某方法可能要求输入的参数不能为null 那么就可以在方法的开始加上下面语句 assertparam null parameterisnullinthemethod 8 4 3何时使用断言 3 检查后置条件 postcondition 在方法计算之后检查结果是否有效 对于一些计算方法 运行完成后 某些值需要保证一定的性质 这时可以通过assert进行检查 例如 对一个计算绝对值的方法就可以在方法的结束处使用下面语句进行检查 assertvalue 0 Valueshouldbebiggerthan0 value 通过这种方式就可以对方法计算的结果进行检查 8 4 3何时使用断言 4 检查程序不变量有些程序中 存在一些不变量 在程序的运行过程中这些变量的值是不变的 这些不变量可能是一个简单表达式 也可能是一个复杂表达式 对于一些关键的不变量 可以通过assert进行检查 例如 在一个财务系统中 公司的收入和支出必须保持一定的平衡 这时就可以编写一个表达式检查这种平衡关系 如下所示 privatebooleanisBalance 8 4 3何时使用断言 在这个系统中 在一些可能影响这种平衡关系的方法的前后 就可以加上assert断言 assertisBalance balanceisdestroyed 8 4 4一个使用断言的示例 下面定义的ObjectStack类使用对象数组实现一个简单的栈类 在push pop 和topValue 方法中使用了断言 程序8 14ObjectStack java 8 4 4一个使用断言的示例 该程序的push 方法 pop 方法和topValue 方法中使用了断言 3个断言的含义是在对象入栈时要求栈顶指针top小于栈的大小size 在对象出栈和取栈顶元素时要求栈不为空 isEmpty 程序中注释掉的两行都将引起断言失败 带 ea选项执行程序时将抛出AssertionError异常 并显示断言失败的信息 8 5小结 异常是程序运行中造成程序终止的错误对象 在Java语言中有两种类型的异常 运行时异常非运行时异常对运行时异常可以不处理 但程序运行若产生该类异常 运行时系统同样抛出 对非运行时异常 要求必须捕获或声明抛出 8 5小结 对异常若不加处理 程序就会终止运行 异常处理有多种方法 使用try catch finally捕获并处理异常使用throws声明方法抛出异常使用throw可以明确抛出异常使用try with resources自动关闭资源 8 5小结 根据需要可以定义自己的异常类 这需要继承Exception类或其子类 断言是Java的一个语句 它用来对程序运行状态进行某种判断 断言包含一个布尔表达式 在程序运行中它的值应该为true 断言用于保证程序的正确性 避免逻辑错误 预习 第9章Java输入输出
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!