1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2022/3/21 Monday,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2022/3/21 Monday,#,异常,第,一,章,目标,了解使用异常的原因,理解Java的异常层次结构,掌握,try,、,throw,和,catch,块检测、指出和处理异常,掌握,finally,子句释放资源,掌握声明新的异常类,概述,异常是指程序运行期间出现的问题,JAVA,语言提供了一套完善的异常处理机制。正确运用这套机制,有助于提高程序的健壮性,本章首先概述异常处理的概念,然后举
2、例说明基本的异常处理技术,Java,异常处理机制,处理异常主要考虑两个问题,如何表示异常情况,如何控制处理异常的流程,Java,异常处理机制,Java,异常处理特点,对异常情况进行分类,用,Java,类来表示异常,具有可扩展性和可重用性,异常流程的代码和正常流程的代码分离,提高了程序可读性,可捕获异常立即处理,也可抛给上一层去处理处理,具有灵活性,Java,异常处理机制,异常类的层次结构,Exception,代表程序的异常,(,可以捕获并处理,),Error,代表运行时的系统异常,(,不应捕获,),Java,异常处理机制,Exception,分为两个分支:,派生自,RuntimeExcepti
3、on,的异常,普通异常,(,非运行时异常,),RuntimeException,非,RuntimeException,一个错误的类型转换,试图读取一个文件结尾后面的数据,一个越界数组访问,试图打开一个错误的,URL,一个空指针访问,试图根据一个不代表任何存在类的字符串来找到一个,Class,类,Java,异常处理机制,常见异常类,异常类,说明,Exception,异常层次结构的根类,ArithmeticException,算术错误情形,如以零作除数,IllegalArgumentException,方法接收到非法参数,ArrayIndexOutOfBoundException,数组大小小于或大
4、于实际的数组大小,NullPointerException,尝试访问,null,对象成员,ClassNotFoundException,不能加载所需的类,NumberFormatException,数字转化格式异常,比如字符串到,float,型数字的转换无效,IOException,输入输出,FileNotFoundException,找不到文件,EOFException,文件结束,Java,异常处理机制,异常处理流程,抛抓模型,运用异常处理机制,Java,提供了,trycatchfinally,语句来支持异常处理,try,/,可能产生异常的语句,catch(,异常类型,e),/,捕获指定类型
5、的异常,,catch,可以有多个,/,处理异常,finally,/finally,块是可选的,/,无论异常是否发生,都会执行的代码,trycatch,语句,trycatch,语句:捕获异常,try,/,可能会出现异常情况的代码,catch(,异常类型一,e1),/,处理出现的异常一类型的异常,catch(,异常类型二,e2),/,处理出现的异常二类型的异常,trycatch,语句,示例:整型变量相除,可能会产生除零异常,/,未捕捉异常,int i,j,result;,i=10;,j=0;,result=i/j;,System.out.println(,运算结果是:,+result);,Syst
6、em.out.println(,程序结束,);,/,运行结果,Exception in thread main,java.lang.ArithmeticException:/by zero,at t01.Excepton1.main(Excepton1.java:8),/,给程序加上异常捕获,try,int i,j,result;,i=10;,j=0;,result=i/j;,System.out.println(,运算结果是:,+result);,catch(ArithmeticException e),System.out.println(,发生除零异常,);,System.out.pri
7、ntln(,程序结束,);,/,运行结果,发生除零异常,程序结束,trycatch,语句,同一段代码中潜在多种异常的情况,try,int i,j,result;,String input=12w;,i=10;,/input中保存用户所输入的数字,这里假设输入错误,输入了字母,j=Integer.parseInt(input);,result=i/j;,System.out.println(运算结果是:+result);,catch(ArithmeticException e1),System.out.println(发生除零异常);,catch(NumberFormatException e2
8、),System.out.println(所输入的内容非数字);,System.out.println(程序结束);,trycatch,语句,如果对多个异常不需要区分,只希望捕获它们不让程序终止,此时只需给出异常的基类即可,try,catch(Exception e),/,所有异常都会在此被捕获,下面这种写法,编译器将报错,try,catch(Exception e1),catch(IOException e2),/,该,catch,块永远不会被执行到,finally语句,finally,:任何情况下都必须执行的代码,finally,块是可选的,finally,块通常放置释放资源的代码,try
9、申请资源,如数据库连接,网络连接,打开文件等,可能出现异常的代码,catch(,异常类型一,e1),处理异常一类型的异常,catch(,异常类型二,e2),处理异常二类型的异常,finally,释放资源,throws,子句,throws,:声明可能出现的异常,如果一个方法会出现异常,但没有能力处理它,可以在方法声明处用,throws,子句来声明抛出异常,访问修饰符 返回类型 方法名,(,参数列表,)throws,异常,1,异常,2,public static void fun()throws NumberFormatException ,方法只负责完成功能,其中产生的异常,就谁调用该方法谁负
10、责处理,throws,子句,方法调用者了解到被调用方法可能抛出的异常,可采取两种措施:,捕获并处理异常,继续声明抛出异常,public void invoke(),try,fun();,catch(NumberFormatException e),/,处理异常,public void invoke()throws NumberFormatException,fun();,/,后续代码,throw,语句,throw,:抛出异常,当位于最上层的子系统不需要关心来自底层的异常的细节时,常见的做法是:异常转译,public void uploadImageFile(String imagePath)t
11、hrows UploadException,try,/,上传图像文件,(,包括操作文件,操作数据库,),catch(IOException e1),/,把原始异常信息记录到日志中去,便于排错,throw new UploadException();,/,抛出新异常,catch(SQLException e2),/,把原始异常信息记录到日志中去,便于排错,throw new UploadException();,/,抛出新异常,用户定义异常,通过扩展,Exception,类来创建自定义的异常,/,自定义 服务器超时异常,public class ServerTimedOutException e
12、xtends Exception,private String reason;,/,异常原因,private int port;,/,服务器端口,public ServerTimedOutException(String reason,int port),this.reason=reason;,this.port=port;,/,抛出自定义异常,throw new ServerTimedOutException(,不能连接服务器,80);,public String getReason()return reason;,public int getPort()return port;,异常处理原
13、则,异常只能用于非正常的情况,不能用异常来控制程序的正常流程。例如:,public static void initArray(int,array),try,int i=,0;,while(true),array i+,=,1,;,catch(ArrayIndexOutOfBoundsException e),异常处理原则,避免过于庞大的,try,块代码块,try,块代码越庞大,出现异常的地方就越多,分析异常原因就越困难,有效的做法是分割可能出现异常的程序段落,分别放在单独的,try,块中,从而分别捕获异常,异常处理原则,在,catch,子句中指定具体的异常类型,/,用,Exception,捕
14、获所有异常,Public void print(),while(文件未打印完),try,打印一行,catch(Exception e),以上代码看起来省事,但实际上,不是好的编程习惯,/,正确的做法是指定具体的异常类型,public void print,while(文件未打印完),try,打印一行,catch(OutOfInkException e1),do,等待用户更换墨盒,while(用户没有更换墨盒),catch(OutOfPaperException e2),do,等待用户添加打印纸,while(用户没有添加打印纸),异常处理原则,不要在,catch,块中忽略被捕获的异常,例如:,t
15、ry,catch(Exception e),/,对异常不采取任何操作,try,catch(Exception e)e.printStackTrace();,/仅仅打印异常信息,catch,块既然捕获了异常,就应提供异常处理措施,处理异常,重新抛出异常,异常转译,总结,Java,的异常处理涉及到,5,个关键字:,try,、,catch,、,throw,、,throws,和,finally,。,异常处理流程由,try,、,catch,和,finally3,个代码块组成。其中,try,代码块包含了可能发生异常的程序代码;,catch,代码块紧跟在,try,代码块后面,用来捕获并处理异常;,final
16、ly,代码块用于释放被占用的相关资源。,Exception,类表示程序中出现的异常,只要通过处理,就可能使程序恢复运行的异常。,对于方法中可能出现的受检查异常,要么用,trycatch,语句捕获并处理它,要么用,throws,子句声明抛出它,,Java,编译器会对此作检查。,I/O流,第,二,章,目标,了解,I/O,流概念,理解,I/O,层次结构,掌握使用字节流,掌握使用字符流,概述,绝大部分的编程工作都涉及到数据的传递控制,(,输入,/,输出,),JAVA,中的,I/O,采用流的方式来实现,即将数据的传递看作为数据在目的和源之间流动,I/O,类库位于,java.io,包中,对各种常见的输入和
17、输出流进行了抽象,概述,按照,I/O,处理数据的不同分为,字节流,字符流,按照功能的不同分为,数据流,操作流,按实现方式的不同分为,底层流,高层流,字节流,将字节作为最小传输单元,由相应的数据流和操作流构成,字节流类层次图如下,(,包括输入流和输出流,),字节流,数据流,(,底层流,),:,InputStream,OutputStream,FileInputStream,FileOutStream,操作流(高层流):,BufferedInputStream,BufferedOutputStream,PrintStream,数据流,负责搭建字节数据传输的通道,负责字节数据的传输,是底层流,只提供
18、了基本的字节数据访问方法,InputStream,和,OutputStram,是所有字节流类的基类,都是抽象类,不能实例化,通过定义了若干的方法来规范派生类的行为,如,I/O,结束后必须关闭流等,数据流,InputStream,所有字节输入流,类的抽象基类,完成将字节从流中读出,public abstract int read()throws IOException,public int read(byte b)throws IOException,public void close()throws IOException,public int available()throws IOExce
19、ption,重要方法:,数据流,OutputStream,所有字节输出流类的抽象基类,完成将字节写入流中,public abstract void write(int b)throws IOException,public void write(byte b)throws IOException,public void flush()throws IOException,public void close()throws IOException,重要方法:,数据流,FileInputStream,InputStream,的派生类,完成从文件中读取字节数据,重要方法:,public FileIn
20、putStream(String name)throws FileNotFoundException,public FileInputStream(File file)throws FileNotFoundException,数据流,使用,FileInputStream,基本步骤:,建立文件输入流,FileInputStream in=new FileInputStream(c:demo.txt);,读入字节数据,(,通常使用循环,),while(i=in.read()!=-1),s=s+(char)i;,关闭,in.close();,在调用,I/O,流的方法时,注意捕捉异常如,IOExcep
21、tion,数据流,FileOutputStream,OutputStream,的派生类,完成将字节数据写入文件中,重要方法:,public FileOutputStream(String name)throws FileNotFoundException,public FileOutputStream(String name,boolean append),throws FileNotFoundException,数据流,使用,FileOutputStream,基本步骤:,1.,建立文件输出流,2.,写字节数据,3.,关闭,try,FileOutputStream out=new FileOu
22、tputStream(file);,String content=Wish give you better future;,char ch=content.toCharArray();/,转换成字符数组,for(int i=0;ich.length;i+)/,循环将字符写入文件,out.write(chi);,out.close();/关闭文件流,否则文件中没内容,catch(Exception e),System.out.println(,写入文件时出错,);,操作流,高层流,不从,I/O,设备中读取或写入数据,仅从其它流中读取或写入数据,提供了普通流所没有提供的方法来简化编程,或提高,I/
23、O,的效率,操作流类利用了“装饰器”设计模式,本身继承了,InputStream,类,加入了大量的方法,用来“装饰”其它数据流类,避免了大量创建新的功能类,操作流,BufferedInputStream,一个带缓冲区的输入流,重要方法:,public BufferedInputStream(InputStream),public BufferedInputStream(InputStream,int),操作流,BufferedOutputStream,一个带缓冲区的输出流,重要方法:,public BufferedOutputStream(OutputStream),public Buffer
24、edOutputStream(OutputStream,int),操作流,PrintStream,提供了,print,和,println,方法,使输出不再被限制于单个字节。且带有缓冲区,重要方法:,public PrintStream(OutputStream out),public PrintStream(OutputStream out,boolean autoFlush),public void flush(),public void println(,类型,x),操作流,import java.io.*;,public class T24,public static void main
25、String args),try,/,创建带有缓冲的字节输入流,BufferedInputStream bi=new BufferedInputStream(System.in);,String s=;,int i;,/,利用循环读取键盘上的输入,并将其转换成字符判断是否不为回车,while(char)(i=bi.read()!=n),s=s+(char)i;,/,创建字节打印输出流,套接系统默认输出流,PrintStream out=new PrintStream(System.out);,out.println(s);,catch(Exception e),System.out.prin
26、tln(I/O,错误,);,字符流,数据流,(,底层流,),:,Reader,Writer,FileReader,FileWriter,操作流,(,高层流,),:,BufferedReader,BufferedWriter,PrintWriter,数据流,R,eader,字符输入流的抽象基类,重要方法,public int read()throws IOException,public abstract int read(char cbuf,int off,int len)throws IOException,public abstract void close()throws IOExcep
27、tion,数据流,Writer,字符输出流的抽象基类,重要方法,public void write(int c)throws IOException,public abstract void write(char cbuf,int off,int len)throws IOException,public abstract void flush()throws IOException,public abstract void close()throws IOException,数据流,FileReader,完成基本的文件,I/O,访问。能以字符方式从文件中读数据,重要方法,public Fil
28、eReader(String fileName)throws FileNotFoundException,public FileReader(File file)throws FileNotFoundException,数据流,FileWriter,使用缺省字符编码构造文件流,向文件输出字符数据。如果文件不存在则创建该文件;如果该文件已存在,则缺省为覆盖该文件,public FileWriter(String fileName)throws IOException,public FileWriter(String fileName,boolean append)throws IOExcepti
29、on,public FileWriter(File file)throws IOException,数据流,示例,FileReader in=new FileReader(file);,/,建立字符文件输入流,可显示中文,while(i=in.read()!=-1),/,循环依次读取文件中的所有字节,s=s+(char)i;,in.close;,FileWriter out=new FileWriter(file);,/,建立字符文件输出流,,可,输出中文,char ch=content.toCharArray();,System.out.println(ch);,for(int i=0;ic
30、h.length;i+),/,循环依次读取字符串中的字符写入文件,out.write(chi);,out.close();,/,关闭文件流,否则文件中没内容,操作流,高层流,采用装饰器设计模式创建,提供了普通流所没有提供的方法来简化编程,或提高,I/O,的效率,操作流,BufferedReader,从字符输入流中读取文本并将字符存入缓冲区以便能提供字符的高效读取。提供了非常重要的读取一行的方法,重要方法,public BufferedReader(Reader in),public BufferedReader(Reader in,int size),public String readLin
31、e()throws IOException,操作流,BufferedWriter,将数据写到缓冲区内,当缓冲区满时,把数据写到字符输出流,public BufferedWriter(Writer),public BufferedWriter(Writer,int),操作流,PrintWriter,将格式化对象打印到一个文本输出流。,public PrintWriter(OutputStream),public PrintWriter(Writer),public PrintWriter(OutputStream,boolean),public PrintWriter(Writer,boolea
32、n),public void println(,类型,x),特殊的,I/O-,字节字符桥接流,InputStreamReader,采用适配器设计模式,把,InputStream,类型转换为,Reader,类型,重要方法,public InputStreamReader(InputStream in),public InputStreamReader(InputStream in,String enc),字节字符桥接流,OutputStreamWriter,采用适配器设计模式,把,OutputStream,类型转换为,Writer,类型,重要方法,public OutputStreamWrite
33、r(OutputStream in),public OutputStreamWriter(OutputStream,String),标准,I/O,java.lang.System,类中提供了三个静态变量,in InputStream,类型,out PrintStream,类型,err PrintStream,类型,标准,I/O,对,System.in,的适配转换,InputStreamReader reader=,new InputStreamReader(System.in);,BufferredReader br=new BufferedRader(reader);,对,System.ou
34、t,的适配转换,PrintWriter pw=new PrintWriter(System.out,true);,File,类,File,类并不在,I/O,的继承结构中,用于表示主机文件系统中的文件名或路径名,重要方法:,public File(String s),public File(String path,String name),public boolean delete(),public boolean exists(),File,类,示例,public class IO4,public static void main(String args),File f=new File(c:
35、demo.txt);,System.out.println(f.getAbsolutePath()+n);,System.out.println(,是否是目录,+f.isDirectory()+n);,System.out.println(,是否隐藏文件,+f.isHidden()+n);,f.delete();,总结,Java I/O,类库对各种常见的数据源、数据目的地及处理过程进行了抽象。客户程序不必知道最终的数据源或数据目的地是一个磁盘上的文件还是一个内存中的数组,都可以按照统一的接口来处理程序的输入和输出。,Java I/O,类库具有两个对称性,他们分别是:,输入和输出,字节流和字符流
36、Java I/O,类库中的高层流在设计中主要采用了装饰器设计模式。,File,类用于管理文件系统,J,DBC(一),第,三,章,目标,了解,JDBC,的四类驱动,理解,JDBC,的访问方式,掌握基本数据库访问,理解,JDBC,中异常,概述,大多数开发语言都提供了数据库的访问,JDBC,是由,SUN,公司提供的一组接口和类,被封装在,java.sql,包中,用于访问数据库,数据库厂商所提供的第三方驱动程序和类包,可以访问特定数据库,JDBC,概述,JDBC,允许大型应用程序把数据写到,JDBC,接口上,通过接口与数据库交换信息。因而编程人员不必太关心与该应用程序一起使用的是那种数据库,JDBC
37、概述,一个完整的,JDBC,应用由三部分组成,驱动程序,驱动程序管理器,应用程序,JDBC,概述,JDBC,的四类驱动,JDBC-ODBC桥加ODBC驱动程序,本地API,JDBC网络纯JAVA驱动程序,本地协议纯JAVA驱动程序,基本数据库访问,通过,JDBC,的接口和类进行数据库访问,基本数据库访问,JDBC,访问数据库的一般步骤,引入必要的类,加载注册,JDBC,驱动程序,标示数据源,分配一个,Connection,对象,分配一个,Statement,对象,使用该,Statement,对象执行查询,从返回的,ResultSet,对象中检索数据,关闭,ResultSet,对象,关闭,St
38、atement,对象,关闭,Connection,对象,基本数据库访问,java.sql,包,接口,(,类,),名,说明,Connection,此接口表示与数据的连接,Statement,此接口执行,SQL,语句并将数据检索到,ResultSet,中,PreparedStatement,此接口执行预编译的,SQL,语句,CallableStatement,此接口执行已存储过程,ResultSet,此接口表示了查询出来的数据库数据结果集,DriverManager,此类加载和卸载各种驱动程序并建立与数据库的连接,Date,此类包含将,sql,日期格式转换成,java,日期格式的各种方法,数据库驱
39、动程序注册,J2EE,的商业开发一般会搭配,MySql,数据库,/加载MySql驱动程序,Class.forName(com.mysql.jdbc.Driver);,数据库连接对象,建立连接,Connection con=DriverManager.getConnection(url,user,password);,url,为连接字符串,语法格式如下:,jdbc:mysql:/host:port/database?,参数名,1=,参数值,1&,参数名,2=,参数值,2.,语句对象,创建,Statement,对象,Statement stmt=conn.createStatement();,执行
40、INSERT,、,UPDATE,或者,DELETE,语句,stmt.executeUpdate(query);/query为所要执行的sql语句,执行,SELECT,语句,ResultSet rs=stmt.executeQuery(query);/rs为记录集对象,记录集对象,ResultSet,接口来操纵结果集中的记录,ResultSet,对象主要提供三大类方法,1.,当前记录指示器移动方法,rs.next();,/,当前记录指针移动到下一条记录上,2.,当前记录字段值获取方法,getXXX,String name=rs.getString(ename);,/,通过字段名访问,Strin
41、g name=rs.getString(2);,/,通过字段位置访问,3.,更新当前字段值的方法,updateXXX,rs.update(ename,jack);,/,通过字段名更新,rs.update(2,jack);,/,通过字段位置访问,记录集对象,关闭数据库对象,关闭,ResultSet,对象,rs.close();,关闭,Statement,对象,stmt.close();,关闭,Connection,对象,con.close();,记录集对象,从数据库,emp,表中读取员工的编号,(empno),和姓名,(ename),Statement stmt=con.createStatem
42、ent();,String query=SELECT empno,ename FROM EMP;,stmt.execute(query);,ResultSet rs=stmt.getResultSet();,while(rs.next(),int i=rs.getInt(1);,/,得到当前记录的第一个字段,(empno),的值,String name=rs.getString(2);,/,得到第二个字段,(ename),的值,System.out.println(Integer.toString(i)+name);,特殊记录集,返回结果记录集分为两大类,仅向前、不可更新记录集,Stateme
43、nt stmt=Con.createStatement();,ResultSet rs=stmt.executeQuery(select empno,ename from emp);,可滚动、可更新记录集,Statement stmt=,Con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);,ResultSet rs=stmt.executeQuery(select empno,ename from emp);,特殊记录集,可滚动、可更新记录集,记录集类型,描述,TYPE_FORWAR
44、D_ONLY,不可滚动,TYPE_SCROLL_INSENSITIVE,可滚动,但看不到外部对数据库的修改,TYPE_SCROLL_SENSITIVE,可滚动,但能看到外部对数据库的修改,记录集并发性,描述,CONCUR_READ_ONLY,指定,ResultSet,对象不能修改数据库,CONCUR_UPDATABLE,指定,ResultSet,对象可以修改数据库,指定以上两种模式时要求,select,语句不能带*号,特殊记录集,可滚动、可更新记录集可以使用的移动记录集指针的方法,next(),移动到记录集的下一条,没有返回,false,,否则返回,true,previous(),移动到前一条
45、记录,first(),移动到第一条记录,last(),移动到最后一条记录,absolute(int rowNumber),移动到,rowNumber,指定的行,relative(int relativeRowNumber),移动到相对于当前纪录位置的某一行,可使用,update(),方法对指定字段进行更新,使用,updateRow(),方法将修改发送到数据库,特殊记录集,特殊记录集,对于可更新结果集使用的查询的限制,:,只能使用一个表,必须选择这个表的主键和所有其他,NOT NULL,列,不能使用,ORDER BY,子句,必须只选择列值,不能包含计算列,不能使用,SELECT*,。你必须分别指
46、定列,或者使用表别名,如,SELECT customers.*from customers,特殊处理,处理数据库中的,null,值,String name=rs.getString(2);,name=name.toUpperCase();,如果,name,获得的是,null,值,则第二句调用方法时出现异常。,ResultSet,的,wasNull(),方法可以检测上一个获取的字段值是否为空,String name=rs.getString(2);,if(rs.wasNull()name=;,name=name.toUpperCase();,处理异常,当数据库或,JDBC,驱动程序中发生错误时,
47、将抛出一个,java.sql.SQLException,SQLException,类是,Exception,类的子类,必须使用,trycatch,对该异常进行处理,SQLException,类定义了,2,个方法,它们有助于查找造成异常的原因,getErrorCode(),返回错误编号,getMessage(),返回错误消息,处理异常,捕获并处理,SQLException,try,/,输入错误的密码,con=DriverManager.getConnection(url,“sa,“123123);,catch(SQLException e),if(e.getErrorCode()=1017),S
48、ystem.out.println(,登录用户名,/,密码错误,);,else,System.out.println(e.getMessage();,总结,JDBC API,的主要接口包括,Connection,、,Statement,和,ResultSet,接口,注册一个驱动,建立起连接对象,在这个连接对象的基础上执行,SQL,语句,返回纪录集,然后利用,getXXX,方法获得数据,。,记录集包括仅向前、不可更新记录集和可滚动、可更新记录集,ResultSet,的,wasNull,方法可以检测数据库字段的空值。,通过捕获,SQLException,来处理数据库异常,总结,JDBC(二),第,
49、四,章,目标,了解预制语句的原理,掌握预制语句的使用,理解JDBC中事务的处理,掌握JavaBean的创建,概述,封装数据库访问,连接工厂类,JavaBean类,高级数据库访问,预制语句,元数据,事务,预置语句,PreparedStatement接口继承自Statement,编译一次可重复执行的语句接口,在sql语句中通过使用占位符来代替常量字段值,setXXX方法来填充字段值,取代掉占位符,形成完整的可执行的sql语句,预置语句,创建预置语句对象,在,sql,语句中使用占位符,String SQL=insert into dept(deptno,dname)values(?,?);,Prep
50、aredStatement ps=con.prepareStatement(SQL);,预置语句,使用setXXX()方法为参数赋值,用 executeUpdate()方法执行SQL语句,ps.setInt(1,60);,ps.setString(2,客服部,);,ps.executeUpdate();,预置语句,示例:使用预置语句插入数据,String sql=insert into emp(empno,ename,hiredate)values(?,?,?);,PreparedStatement pstmt=con.prepareStatement(sql);,pstmt.setInt(1
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818