Java的异常处理课件

PPT
  • 阅读 85 次
  • 下载 0 次
  • 页数 70 页
  • 大小 800.500 KB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
Java的异常处理课件
可在后台配置第一页与第二页中间广告代码
Java的异常处理课件
可在后台配置第二页与第三页中间广告代码
Java的异常处理课件
可在后台配置第三页与第四页中间广告代码
Java的异常处理课件
Java的异常处理课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 70
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】Java的异常处理课件.ppt,共(70)页,800.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-3034.html

以下为本文档部分文字说明:

第五章Java的异常处理第1页,共70页。为什么要异常处理?•对于任何语言的程序设计而言,错误的发生总是不可避免的.•比如说:•①用户输入出错•②所需文件找不到•③运行时磁盘空间不够•④内存耗尽无法进

行类的实例化•⑤算术运算错(数的溢出,被零除…)•⑥数组下标越界⑦JVM崩溃•……•当Java程序出现以上的错误时,就会在所处的方法中产生一个异常对象。这个异常对象包括错误的类型,错误出现时程序的运行状态以及对该错误的详细描述。下面我们先看一个简单的例子。第2页,共

70页。•例5.1•publicclassExceptionDemo{•publicstaticvoidmain(Stringargs[]){•intx=100;•System.out.println("Theresultis"+x/10);•System.

out.println("Dividedbyzero:"+x/0);}}第3页,共70页。•当我们对其编译后运行时,其对应的结果如下:•其意思是说,本程序执行到语句“System.out.println(

"Dividedbyzero:"+x/0)”时,系统会抛出一个例外,该例外在Java中定义为ArithmeticException(即属于算术运算例外)。c:\jbuilder3\java\bin>javaExceptionDemoTheresultis10Exceptioni

nthread"main"java.lang.ArithmeticException:/byzeroatExceptionDemo.main(ExceptionDemo.java:5)第4页,共70页。5.1什么是异常•异常(Exception)

又称为例外,是指在程序运行过程中发生的非正常事件,它会中断指令的正常执行,影响程序的正常运行。第5页,共70页。异常对象•在Java语言中,我们用异常对象来表示不同的异常。•所谓Java异常对象就是一个存

放着相关错误信息的对象,如果方法运行时产生了异常,该方法就可以抛出一个异常对象•为了表示不同种类的异常,Java语言中定义了许多异常类。第6页,共70页。•异常处理的一般步骤:异常抛出异常捕获异常处理5.2异常处理机制第7页,共70页。异常处理机制•在Java

程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。•生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。第8页,共70页。异常处理机制•当Java运行时系统得到一个异常对象时,它将会寻找处理这一异常的代码。找到能够处理这种类型的异

常的方法后,运行时系统把当前异常对象交给这个方法进行处理,这一过程称为捕获(catch)异常。•如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。第9页,共70页。方法的调用堆栈main()methodA()method

B()methodC()调用•Java程序在执行的过程中,形成了一个先进后出的调用堆栈,各方法之间依照调用先后的不同,由先至后的进入调用堆栈,堆栈的最上层即是当前被调用执行的方法。该方法执行完毕后,会将处理

器控制权交还给调用他的方法,依此类推。第10页,共70页。方法调用堆栈中异常对象的传递•当某一方法中的一个语句抛出一个异常时,如果该方法中没有处理该异常的语句,那么该方法就会中止执行,并将这个异常传递给堆栈中的下

一层方法,直到某一方法中含有处理该异常的语句为止。如果该异常被传递至主方法,而主方法中仍然没有处理该异常的语句,则异常将会被抛至JVM,程序中断。main()methodA()methodB()methodC()调用传递第11页,共70页。例程publi

cclassExampleOfException{String[]lines={"Thefirstline","Thesecondline","Thelastline"};publicstaticvoidmain(String[]args){Ex

ampleOfExceptioneoe=newExampleOfException();eoe.methodA();System.out.println("Programfinished.");}vo

idmethodA(){methodB();}voidmethodB(){methodC();}voidmethodC(){for(inti=0;i<4;i++)System.out.println(lines[i]);}}ThefirstlineThesecon

dlineThelastlineExceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3atExampleOfException.methodC(ExampleOfExce

ption.java:16)atExampleOfException.methodB(ExampleOfException.java:12)atExampleOfException.methodA(ExampleOfException.java:9)atExampleOfE

xception.main(ExampleOfException.java:6)第12页,共70页。Java中的异常类•在Java语言中,任何的异常对象都是Throwable类的直接子类或间接子类的实例。Java的类库已经提供了一些常见的异常类,如果这

些异常类不能够满足要求,用户也可以创建自己的异常类。ThrowableExceptionRuntimeExceptionIOExceptionNullPointerExceptionArithmeticException……FileNotFoundEx

ception…………ErrorVirtualMachineError……第13页,共70页。AWTExceptionThrowableErrorExceptionRuntimeExceptionIOExceptionLinkageErrorVi

rtualMachineErrorAWTErrorArithmeticExceptionIndexOutOfBounds.InterruptedExceptionFileNotFoundExceptionEOFException...............

.第14页,共70页。异常(Throwable)分类•Error动态链接失败,虚拟机错误等,通常Java程序不应该捕获这类异常,也不会抛出这种异常。•Exception•运行时异常继承于RuntimeException。Java编译器允许程序不对它们做出处理。•非运行时异常除了运行时

异常之外的其他由Exception继承来的异常类。Java编译器要求程序必须捕获或者声明抛出这种异常。第15页,共70页。Error类•Error类表示Java运行时产生的系统内部错误或资源耗尽等严重错误。•这种错误通常是程

序无法控制和解决的,如果发生这种错误,通常的做法是通知用户并中止程序的执行。第16页,共70页。典型的错误类•NoClassDefFoundError•OutOfMemoryError•VirtualMachineError•。。。。第17页,共70页。表5.1Java常见错

误列表类名功能描述ClassCircularityError初始化某类检测到类的循环调用错误ClassFormatError非法类格式错误IllegalAccessError非法访问错误IncompatibleClassChangError非兼容类更新错误InternalError系统内部错误Li

nkageError链接错误NoClassDefFoundError运行系统找不到被引用类的定义第18页,共70页。NoSuchFieldError找不到指定域错误NoSuchMethodError所调用的方法不存在OutofMemoryError内存

不足错误UnknownError系统无法确认的错误UnsatisfiedLinkError定义为本地的方法运行时与另外的例程相连接错误VerifyError代码校验错误VirtualMachineError虚拟机出错,可能JVM错或资源不足InstantiationError企图实例

化一个接口或抽象类的错误第19页,共70页。Exception类•Exception的子类表示了不同类型的异常,例如RuntimeException表示运行时异常,而IOException表示I/O问题引起的异常。•这些子类也可以被继承以对不同类型的异常进

行细分,如RuntimeException还可细分为NullPointerException、ArithmeticException等;IOException还可细分为FileNotFoundException、EOF

Exception等。第20页,共70页。典型的异常类•ArithmeticException•ArrayIndexOutOfBandsException•IOException•FileNotFoundException•NullPointerException•NumberForma

tException第21页,共70页。表5.2Java常见的一般异常列表类名功能描述IllegalAccessException非法访问异常ClassNotFoundException指定类或接口不存在异常CloneNot

SupportException对象使用clone方法而不实现cloneable接口IOException输入/输出异常InterruptedIOException中断输入/输出操作异常第22页,共70页。I

nterruptedException中断异常(常常应用于线程操作中)EOFException输入流中遇到非正常的EOF标志FileNotFoundException指定文件找不到MalformedURLEx

ceptionURL格式不正确ProtocolException网络协议异常SocketExceptionSocket操作异常UnknownHostException给定的服务器地址无法解析UnknownServiceException网络请求服务出错UTF

DataFormatExceptionUTF格式字符串转换出错InstantiationException企图实例化接口或抽象类NoSuchMethodException找不到指定的方法第23页,共70页。表

5.3Java常见的运行异常列表类名功能描述ArithmeticException算术运算除数为零IndexOutofBoundException下标越界错误ArrayIndexOutofBoundsException数组元素下标越界错误StringIndexOutofBoun

dsException字符串下标越界错误ClassCastException类型强制转换异常NegativeArraySizeException数组的长度为负异常NullPointerException

非法使用空指针异常第24页,共70页。NumberFormatException非法数据格式异常IllegalArgumentException非法参数异常IllegalMonitorStateException非法监

视器操作异常IllegalThreadStateException非法线程状态异常EmptyStackException栈空异常,对空栈进行操作NoSuchElementException枚举对象不存

在给定的元素异常SecurityException安全性异常第25页,共70页。必检异常与非必检异常•RuntimeException类及其子类被称为“运行时异常”•一般发生在JRE内部•也称“非必检异常”•如NullPointerExcepti

on•其他异常被成为“非运行时异常”•一般发生在JRE外部•也称“必检异常”•如IOException第26页,共70页。5.3异常类的使用•要捕获一个异常,程序员只需要在程序中设置一个try/catch块,其格式如下:t

ry{抛出异常的代码}catch(某Exception类型e){处理该异常类型的代码}catch(某Exception类型e){处理该异常类型的代码}第27页,共70页。•try捕获异常的第一步是用try{…}选定捕获异常的范围,由try所限定的代码块中的语句在执行

过程中可能会生成异常对象并抛出。第28页,共70页。•catch每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的异常事件。catch语句只需要一个形式参数指明它所能够捕获的异常类型,这个类必须是Throwable的子类,运行时系统通过参

数值把被抛出的异常对象传递给catch块.在catch块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的变量或调用它的方法。getMessage()是类Throwable所提供的方法,用来得到有关异常事件的信息,类Throwable还提供了方法print

StackTrace()用来跟踪异常事件发生时执行堆栈的内容。第29页,共70页。异常的捕获过程•当try块中的某条代码抛出异常时:首先,自该语句的下一条语句起的所有try块中的剩余语句将被跳过不予执行;其次,程序执行catch子句进行异常捕获,异常捕获的目的是进行异常类型的匹配

,并执行与所抛出的异常类型相对应的catch子句中的异常处理代码。第30页,共70页。异常的捕获过程•需要注意的是:如果try块中没有任何的异常抛出,则所有的catch子句将会被跳过;如果try块中所抛出的异常对象类型与所有的catch子句中的

所声明的异常类型都不匹配,则方法会立即中止,并将该异常对象继续抛出,沿调用堆栈传递。第31页,共70页。examplepublicclassExampleOfException{String[]lines={"Thefirstline","Thesecondline

","Thelastline"};publicstaticvoidmain(String[]args){ExampleOfExceptioneoe=newExampleOfException();eoe.methodA();S

ystem.out.println("Programfinished.");}...voidmethodC(){for(inti=0;i<4;i++){try{System.out.println(lines[i]);}catch(ArrayIndexOutOfBoundsExcepti

one){System.out.println("Re-settingIndexValue");}}}}第32页,共70页。example•上面的例子中可能会产生数组越界异常,所以将其置于try块中,并在catch子句中

对ArrayIndexOutOfBoundsException类型的异常进行捕获,并进行处理。•如果try块中可能抛出多个类型的异常,程序员可以使用多个catch子句对这些异常进行捕获,每种异常类型对应一个单独的catch子句。•需要注意的是,这些catch子句

是顺序执行的。这意味着,异常对象总是被第一个catch子句首先捕获,如果类型不匹配,才会执行下一个catch子句。读者可以试着分析下面的程序片断,看看有什么样的问题存在。第33页,共70页。问题•Ja

va运行系统从上到下分别对每个catch语句处理的例外类型进行检测,直到类型匹配为止;•catch语句的排列顺序应该是从子类到父类try{…}catch(Exceptione){…}catch(IOExceptione){…}catch(ArrayIndexOutOfBoundsEx

ceptione){…}第34页,共70页。catch语句的顺序•捕获异常的顺序和不同catch语句的顺序有关,当捕获到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应

该捕获最特殊的异常,然后再逐渐一般化。也就是一般先安排子类,再安排父类。第35页,共70页。•finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其

它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。第36页,共70页。finally•finally子句的一般格式:try{抛出异常的代码}catch(某Exception类型e){处理该异常类型的代码}…}catch(某Exce

ption类型e){处理该异常类型的代码}finally{最后一定会被执行的代码}第37页,共70页。finally•不论try块中的代码是否抛出异常及异常是否被捕获,finally子句中的代码一定会被执行:•如果try块中没有抛出任

何异常,当try块中的代码执行结束后,finally中的代码将会被执行;•如果try块中抛出了一个异常且该异常被catch正常捕获,那么try块中自抛出异常的代码之后的所有代码将会被跳过,程序接着执行与抛出异常类型匹配的catch子句中

的代码,最后执行finally子句中的代码。•如果try块中抛出了一个不能被任何catch子句捕获(匹配)的异常,try块中剩下的代码将会被跳过,程序接着执行finally子句中的代码,未被捕获的异常对象继续抛出,沿调用堆栈顺序

传递。第38页,共70页。问题•当调用上述方法m()时,try块中包含方法的return语句,返回值为1。然而,实际调用该方法后产生的返回值为0。这是因为在方法实际返回并结束前,finally子句中的内容无论如何要被执行,

所以finally子句中的return语句使得该方法最终实际返回值为0。publicintm(){try{return1;}finally{return0;}}第39页,共70页。examplepublicclassTryCatchFinally{stat

icvoidProc(intsel){System.out.println("-----InSituation"+sel+"-----");try{if(sel==0){System.out.println("noExceptioncaug

ht");return;}elseif(sel==1){inti=0;intj=4/i;}elseif(sel==2){intiArray[]=newint[4];iArray[10]=3;}第40页,共70页。example}catch(Arithmeti

cExceptione){System.out.println("Catch"+e);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e.getMessage())

;}catch(Exceptione){System.out.println("Willnotbeexecuted");}finally{System.out.println("inProcfinally");}

}publicstaticvoidmain(Stringargs[]){Proc(0);Proc(1);Proc(2);}}程序运行结果:-----InSituation0-----noExceptioncaughtinProcfinally-----InSituation

1-----Catchjava.lang.ArithmeticException:/byzeroinProcfinally-----InSituation2-----Catch10inProcfinally第41页,共70页。声明异常•一个方法不处理它产生的异常,而是沿着调用堆栈向上传递,由调用

它的方法来处理这些异常,则需要声明异常。相比较捕获异常来讲,这种处理异常的方式较消极,所以有时候也该方式叫做异常的消极处理方式,管捕获异常叫做积极处理方式。第42页,共70页。声明抛出异常•声明抛出异常是在一个方法声明中的throws子句中指明的。•声明异常的方法:returnTyp

emethodName([paramlist])throwsexceptionList•例如:voidcompute(intx)throwsArithmeticException{…}•例如:publicintread()throwsIOExce

ption{......}throws子句中同时可以指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛出它们。第43页,共70页。publicclassThrowsException{staticvoidproc(intsel)throwsAr

ithmeticException,ArrayIndexOutOfBoundsException{System.out.println("InSituation"+sel);if(sel==0){System.out.println("noExcep

tioncaught");return;}elseif(sel==1){intiArray[]=newint[4];iArray[10]=3;}}第44页,共70页。publicstaticvoidmain(Stringargs[])

{try{proc(0);proc(1);}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e);}finally{System.out.println("i

nProcfinally");}}}第45页,共70页。运行结果InSituation0noExceptioncaughtInSituation1Catchjava.lang.ArrayIndexOutOfBounds

Exception:10inProcfinally第46页,共70页。examplepublicclassThrowsException1{staticvoidProc(intsel)throwsArrayIndexOutOfBound

sException{System.out.println("-----InSituation"+sel+"-----");if(sel==0){System.out.println("noExceptioncaught");ret

urn;}elseif(sel==1){intiArray[]=newint[4];iArray[10]=3;}}第47页,共70页。examplepublicstaticvoidmain(Stringargs[]){try{Proc(0);Proc(1);}catch

(ArrayIndexOutOfBoundsExceptione){System.out.println("Catch"+e);}finally{System.out.println("inProcfinally");}}}程序运行结果:-----InSitua

tion0-----noExceptioncaught-----InSituation1-----Catchjava.lang.ArrayIndexOutOfBoundsException:10inProcfinally第48页,共70页。抛出异常•若某方法中需要直接抛出

某异常时,可使用throw语句实现,具体步骤应该是:•选择合适的异常类;•创建该类的一个对象;•使用throw语句抛出该对象。第49页,共70页。抛出异常•抛出异常首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成。生成异常对象是通过

throw语句实现的。IOExceptione=newIOException();throwe;可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:thrownewString("wanttothrow");第

50页,共70页。抛出异常•例如,某方法readFile()对文件进行读操作,根据前面章节的介绍可以知道:当进行I/O操作时,可能会产生I/O异常。所以,在方法readFile中如果读文件操作不成功,则应抛出I/O异常。如下列程序片断所示:readFile()t

hrowsIOException{…if(读文件不成功)thrownewIOExcepion();}第51页,共70页。抛出异常•如果一个方法可能抛出多个必检异常,那么必须在方法的声明部分一一列出,多个异常间使用逗号

进行分隔:ClassMyClass{…publicmyMethod(Strings)throwsIOException,MalformedURLException{…}…}第52页,共70页。抛出异常•一个方法必须通过throws语句在方法的声明部分说

明它可能抛出而并未捕获的所有的“必检异常”,如果没有这么做,将不能通过编译。•值得注意的是:如果在子类中覆盖了父类的某一方法,那么该子类方法不可以比被其覆盖的父类方法抛出更多的异常(但可以更少)。所以,

如果被覆盖父类的方法没有抛出任何的“必检异常”,那么子类方法绝不可能抛出“必检异常”。第53页,共70页。抛出异常•在下面的例子里,对于父类SuperClass而言,类SubClassA是正确的子类,而SubClassB则是错误的。classSuperClass{publ

icsuperMethod()throwsEOFException{…}}classSubClassAextendsSuperClass{//正确publicsuperMethod(){…}}classS

ubClassBextendsSuperClass{//错误publicsuperMethod()throwsFileNotFoundException{…}}第54页,共70页。5.4自定义异常类•Java语言中允许用户定义自己的异常类,但自定义异常类必须是Throwable的直接子类或

间接子类。同时要理解一个方法所声明抛出的异常是作为这个方法与外界交互的一部分而存在的。方法的调用者必须了解这些异常,并确定如何正确的处理他们。第55页,共70页。创建异常类注意:•根据Java异常类的继承关系,用户最好将自己的异常类定义为Exception的子类,

而不要将其定义为RuntimeException的子类。因为对于RuntimeException的子类而言,即使调用者不进行处理,编译程序也不会报错。将自定义异常类定义为Exception的子类,可以确保调用者对其进行处理。第56页

,共70页。exampleclassMyExceptionextendsException{privateintdetail;MyException(inta){detail=a;}publicStringtoSt

ring(){return"MyException"+detail;}}第57页,共70页。examplepublicclassExceptionDemo{staticvoidcompute(inta)throwsMyException{System.out.println("calle

dcompute("+a+")");if(a>10)thrownewMyException(a);System.out.println("normalexit");}publicstaticvoidmain(Stringargs[]){try{

compute(1);compute(20);}catch(MyExceptione){System.out.println("Caught"+e);}}}程序运行结果:calledcompute(1)nor

malexitcalledcompute(20)CaughtMyException20第58页,共70页。异常类的使用•运行时异常则表示由运行时系统所检测到的程序设计问题或者API的使用不当问题,它可能在程序的任何地方出现:(1)对于运行时异常

,如果不能预测它何时发生,程序可以不做处理,而是让Java虚拟机去处理它。(2)如果程序可以预知运行时异常可能发生的地点和时间,则应该在程序中进行处理,而不应简单的把它交给运行时系统。第59页,共70页。异常类的使用(3)在自定义异常类时,如果

它所对应的异常事件通常总是在运行时产生的,而且不容易预测它将在何时、何处发生,则可以把它定义为运行时异常,否则应定义为非运行时异常。第60页,共70页。异常类的使用•积极处理方式:importjava.io.*;c

lassExceptionDemo1{publicstaticvoidmain(Stringargs[]){try{FileInputStreamfis=newFileInputStream("text");}catch(FileNotFoun

dExceptione){……}……}}第61页,共70页。异常类的使用•消极处理方式:importjava.io.*;classExceptionDemo1{publicstaticvoidmain(Stringargs[])throwsF

ileNotFoundException{FileInputStreamfis=newFileInputStream("text");……}}第62页,共70页。异常类的使用•如果采用消极处理方式,则由调用该方法的方法进行处理;但是调用该方法的方法也可以采用消极和积极两种处理方式

,一直传递到Java运行环境.第63页,共70页。异常的优点•将错误处理代码与“常规”代码分离;将错误沿调用堆栈传递;•可以由感兴趣的方法来处理异常•对错误类型进行分组和区分。第64页,共70页。说明的问题•方法也可以不对异常进行捕获而直接将其抛出,并在方法

声明中进行说明,那么对方法产生的异常到底是应该直接进行捕获还是应该将其进行传递呢?•一般来说,对于方法的最终调用者而言,他必须捕获并处理该方法抛出的异常。而对于抛出异常的方法而言,应该对方法可能产生的异常进行区分,尽量避免一些异常的产生,捕获并处理那些你知道

如何处理的异常,而对那些你不知道方法的调用者会如何处理的异常,最好将它们留给方法的调用者进行处理,这样会增加程序的灵活性。第65页,共70页。说明的问题•需要特别指出的是,虽然异常处理机制为程序员提供了非常大的方便,但是作为一个好的程序员要尽量避免异常的过度使用。这是

因为:异常对象的实例化和其后续处理工作是非常消耗资源的,过度的使用异常会明显影响程序的执行速度。所以,在使用异常处理时应该仔细考虑,只对有必要的异常情况使用异常,而不可以将异常泛化。第66页,共70页。两段代码的比较代码1:try{intn=InputReader.inputInteger(请输入

一个整数");if(n<100||n>1)thrownewNumberFormatException();}catch(NumberFormatExceptione){System.out.println("输入范围错误!");}代码2:intn=InputReader.

inputInteger(请输入一个整数");if(n<100||n>1)System.out.println("输入范围错误!");代码1采用了异常处理方式;代码2则通过对用户输入的分析避免了异常的使用,提高了代码效率。

第67页,共70页。问题下面的代码合法吗?try{...}finally{...}下面的代码可以捕获何种异常?使用这种异常处理器有什么问题?catch(Exceptione){...}第68页,共70页。问题下面的处理器可以捕获什么异常?}catch(Excep

tione){...}catch(ArithmeticExceptiona){...}这个异常处理器中有错误吗?此代码能否被编译?第69页,共70页。问题publicstaticvoidcat(Filenamed){RandomAccessFileinput=nu

ll;Stringline=null;try{input=newRandomAccessFile(named,“r”);while((line=input.readLine())!=null{System.out.printl

n(line);}return;}finally{if(input!=null){input.close();}}}第70页,共70页。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?