社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 17565阅读
  • 32回复

[JAVA]全新java初学者实践教程【全集 欢迎收藏】(Java SE5.0版)

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

--配置环境变量 *3A3>Rwu  
z +3<$Z  
最近我发现不少初学者,学习java的时候,看了好多java的历史、优点和应用范围。对于这些知识,并不难理解。我也当然同意java是一种优秀的计算机语言。但是对于我们来说要了解的并不是,这些历史等知识。而是掌握java这套技术。要想掌握这套技术实践是非常重要的。那么很多初学者,在第一步实践的时候就遇到了困难,就是配置环境变量。以至于,因无法继续实践而苦恼。下面为了帮广大爱好者解决这个问题,[font="Times]“百家拳软件项目研究室[font="Times]”特别写了这个教程来与大家共享。 5cyddlaat  
                                                                                o }9M`[  
    环境变量这个概念,是我们平时用电脑时不常用的概念,所以大家在下载完jdk之后,不知如何配置环境变量。下面我解释一下,环境变量相对于给系统或用户应用程序设置的一些变量。应该怎么理解呢?我们来做一个实验吧! g  ,/a6M  
  实践:鼠标单击 开始――>运行――> cmd,进入了DOS的窗口。我们在任意目录下敲QQ。会出现  “ 'QQ' 不是内部或外部命令,也不是可运行的程序或批处理文件。”这段话 T[5gom  
  其实也是啊,在当前的目录根本就没有QQ这个文件啊。我的QQ程序安装在 D:\Tencent\QQ 下 P &;y] ,)E  
了。你们做的时候找到这个目录。在dos下进入这个目录,再敲QQ。就会发现弹出了QQ的登陆窗口。那么怎样能使,我们在任何目录下都可以敲QQ就可以执行呢。那就是设置环境变量了。 7ei>L]gm%  
        实践:我们现在桌面上,右键单击 我的电脑――>属性――>选择“高级”选卡――>环境变量。现示的结果如图1-1 Q!4i_)rM  
 ${A5-  
                            图  1-1 G0_&gx`  
环境变量分为两类,一个是上半部分区域用户变量,另一个是下半部分系统变量。用户变量是只适用于当前用户使用,换了用户就不管用了。而系统变量则是任何用户都可以使用。呵呵,这样说可以理解吧。  我们现在在用户变量里面按“新建”。在变量名里面输入path(不区分大小写) "rme~w Di  
变量值里面输入你QQ的安装路径,我的QQ安在了 D:\Tencent\QQ 所以你们按照自己的来做哦 g".d"d{  
                      :V&N\>Wo  
                                图 1-2 [D*J[?yt  
然后一路按“确定”按钮。接着,新打开一个DOS窗口。切记,一定要新打开一个DOS窗口,用原来的是不行的。这回在任意的目录下,敲QQ 回车。就会发现弹出窗口了。大家做出来了吗? +3M$3w{2  
      所以现在我来做一下总结性陈词:环境变量相对于给系统或用户应用程序设置的一些变量, 具体起什么作用这当然和具体的环境变量相关. 象path, 是告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序外, 还应到那些目录下去找。当然还有很多的变量啊!以后我们会慢慢的学到。 1*C:h g@  
      说了这么多,我们开始开始正式的配置jdk吧!马上就可以敲出java代码了。 8q]J;T  
实践:1、在sun公司的官方网站下载jdk。或者在百度或google搜索jdk下载。安装jdk; Wmzq  
    2、在[font="Times]“用户变量[font="Times]”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击[font="Times]“编辑[font="Times]”,不存在则点击[font="Times]“新建[font="Times]”; !1ML%}vvB,  
[font="Times]3、[font="Times]JAVA_HOME设为[font="Times]JDK的安装路径[font="Times](如[font="Times]C:\Program Files\Java\jdk 1.5.0 _11),此路径下包括[font="Times]lib,[font="Times]bin,[font="Times]jre等文件夹(此变量最好设置,因为以后运行[font="Times]tomcat,[font="Times]eclipse等都需要依靠此变量); t{/hkXq]  
[font="Times]Path使得系统可以在任何路径下识别[font="Times]java命令,设为:[font="Times]%JAVA_HOME%\bin ,sO:$  
[font="Times]CLASSPATH为[font="Times]java加载类[font="Times](class or lib)路径,只有类在[font="Times]classpath中,[font="Times]java命令才能识别,设为:[font="Times].;%JAVA_HOME%\lib;%JAVA_HOME%\lib(要加[font="Times].表示当前路径[font="Times]) %JAVA_HOME%就是引用前面指定的[font="Times]JAVA_HOME。形如[font="Times] 图[font="Times]1-[font="Times]1 q*~gWn>T  
4、打开一个DOS窗口,输入“java -version”。 GY oZ$p"C  
看看出现了,一大堆的版本信息就说明已经配置成功了。配置已经成功了,我们如何使用jdk呢?请看下回
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

发帖
27
铜板
29
人品值
21
贡献值
0
交易币
0
好评度
27
信誉值
0
金币
0
所在楼道
学一楼
只看该作者 32 发表于: 2010-10-27
AJAX简介
AJAX简介 UH5w7M  
1、    定义 p]wP36<S!  
Ajax这个概念的最早提出者Jesse James Garrett认为: ANckv|&'v  
Ajax是Asynchronous JavaScript and XML的缩写。 FJO"|||Y'|  
Ajax并不是一门新的语言或技术,它实际上是几项技术按一定的方式组合在一在同共的协作中发挥各自的作用,它包括 (7IqY1W  
    使用XHTML和CSS标准化呈现; C@*%AY  
    使用DOM实现动态显示和交互; %4j&H!y-w;  
    使用XML和XSLT进行数据交换与处理; ;knd7SC   
    使用XMLHttpRequest进行异步数据读取; |J:$MX~  
    最后用JavaScript绑定和处理所有数据; RS'} nY}  
HR;/Br  
2.Ajax工作原理 D+f'*|  
Ajax的工作原理相当于在用户和服务器之间加了一个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。 o:_^gJ+|  
Ajax工作原理如下图所示。 sT)6nV  
,VAp>x+O  
. 3Gn ZR,L  
Q(lku"U'  
更多免费技术文章和技术讲座视频请参考www.ascenttech.cn BR;QY1  
发帖
27
铜板
29
人品值
21
贡献值
0
交易币
0
好评度
27
信誉值
0
金币
0
所在楼道
学一楼
只看该作者 31 发表于: 2010-10-27
23个设计模式
主要的23个设计模式: +W6Hva.  
在设计模式一书中涉及到23个模式,被分类为创建型模式,结构型模式和行为模式,分别从对象的创建,对象和对象间的结构组合以及对象交互这三个方面为面向对象系统建模方法给予了解析和指导。 mKV'jm0  
1xz\=HOT  
主要的23个设计模式概述如下: [_h%F,_ A  
gF3TwAr  
    Abstract Fractory fCB:733H  
提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类. "ml?7Xl,n  
    Adapter Yj) e$f  
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 QjLji +L  
    Bridge p"KU7-BfvC  
将抽象部分与它的实现部分分离,使它们都可以独立地变化。 O:1DOUYXs  
    Builder u,f A!  
将一个复杂对象的构建与它的表示分离,使得同样的构件过程可以创建不同的表示 prZ55MS.  
    Chain of Responsibility #Rc5c+/(  
解除请求的发送者和接收者之间的耦合,从而使多个对象都有机会处理这个请求。将这些对象连接成一条链来传递该请求,直到有一个对象处理它。 So#dJ>   
    Command iSlFRv?a  
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持取消操作 o w2$o\hC  
    Composite |=\91fP68`  
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。 Raefj(^V  
    Decorator mG_BM/$  
动态地给一个对象添加一些额外的职责。 <{giHT  
    Façade Rv vh{U;t  
为子系统中的一组接口提供一个一致的界面。 s|Zx(.EP  
    Factory Method h2% J/69  
定义一个用于创建对象的接口,让子类决定将哪个类实例化。 u yFn}y62  
    Flyweight B s,as  
运用共享技术有效地支持大量细粒度(fine grained)的对象。 NgHpIonC  
    Interpreter ,>u=gA&}  
给定一个语言,定义它的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子 VpSEVd:n  
    Iterator CN/IH   
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 +vz` go  
    Mediator Z v4<b  
用一个中介对象来封装一系列的对象交互。 !h>D;k6 e  
    Memento R uLvG+  
在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态。 }kE87x'  
    Observer J='W+=N  
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖它的对象都得到通知并自动刷新。 0N{+y}/G  
    Prototype i&A%"lOI9  
用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 XvskB[\  
    Proxy . |uLt J  
为其他对象提供一个代理以控制对这个对象的访问。  5@ foxI  
    Singleton :M j_2  
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 kM!V .e[g  
    State Q2eXK[?*  
允许一个对象在其内部状态改变时改变它的行为。 kJkxx*:u  
    Strategy t8& q9$  
定义以系列算法,把它们一个个封装起来,并且使它们可相互替换。 Jf)3< ~G  
    Template Method :tM?%=Q  
定义一个操作中的算法框架,而将一些步骤延迟到子类中。 t+Z`n(>  
    Visitor ?U_9{}r  
表示一个作用于某对象结构中的各元素的操作。 ~GG?GB  
<*u C  
更多免费技术文章和技术讲座视频请参考www.ascenttech.com.cn bD<qNqX$  
发帖
1
铜板
1
人品值
1
贡献值
0
交易币
0
好评度
1
信誉值
0
金币
0
所在楼道
只看该作者 30 发表于: 2008-04-30
请问楼主下面这段代码是不是没打全啊?能修改一下吗,还有流的前3个例子不能下载 ,4@|1z{bfm  
w2"]Pl  
for (int i=0; i  --k:a$Nt  
    f.write('X'); `T WN^0!]  
        System.out.println(f.toString());}} <' m6^]:  
e<=;i" |  
1]OSWCEm*[  
UuJjO^t  
 
走自己的路
级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
只看该作者 29 发表于: 2007-11-27
最近考虑是继续研究JEE5.0 还是转型到dotnet或ror
级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 28 发表于: 2007-11-02
还没转 le .'pP@  
{BV4h%P]:  
放些有用的帖子在这里就是

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
只看该作者 27 发表于: 2007-10-30
什么时候改研究JAVA了 WEB方向看好ROR~~
级别: 终身会员
发帖
4046
铜板
-119076
人品值
-803058
贡献值
43
交易币
0
好评度
4062
信誉值
0
金币
1
所在楼道
学一楼
只看该作者 26 发表于: 2007-10-10
报告lz  看不懂.......    先来vf...........
级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 25 发表于: 2007-10-10
全新java初学者实践教程26(java SE5.0版) "$)yB  
网络程序 nCaLdj?  
*cNk>y  
]w22@s  
[font="Times]Java在网络编程这个地方做的很好,[font="Times]java的主要目的也是为了网络而生的,它能方便的访问网络上的资源。我们这节课来介绍网络通讯的两种机制:[font="Times]URL通信机制,[font="Times]Socket通信机制。 08r[K(bfb,  
[font="Times]    URL表示了[font="Times]Internet上一个资源的引用或地址。[font="Times]Java网络应用程序也是使用[font="Times]URL来定位要访问的[font="Times]Internet的资源。在[font="Times]jdk里面[font="Times]java.net.URL也是一个类,它来封装[font="Times]URL的一些细节。目前大家可以把[font="Times]URL理解为网址,[font="Times] hyu}}0:  
[url]http://www.100jq.com/default.aspx
[/url][font="Times] gCV rC  
这就是个[font="Times]URL。[font="Times]http是协议名(超文本传输协议)用“[font="Times]://”隔开[font="Times]www.100jq.com[font="Times] 是主机名。[font="Times]Default.aspx是文件名。它的端口号没有写,默认是[font="Times]80。 GOr}/y;  
实践: 'NjSu64W  
import java.net.*; *l!5QG UoK  
public class ParseURL { +x]e-P%  
    public static void main(String[] args) throws MalformedURLException{ PqfVX8/q0  
      URL url = new URL("http://www.100jq.com:45175/default.aspx"); kI+b <$:D  
      System.out.println("协议是 "+url.getProtocol()); }x0Z( `  
      System.out.println("主机是 "+url.getHost()); 0/Q5d,'Y[2  
      System.out.println("文件名是 "+url.getFile()); b]#~39Iph  
      System.out.println("端口号是 "+url.getPort()); b|wWHNEdb,  
    }} D_ ug-<QT  
/* vKkf2 7  
  URL这个对象中提供了很多方法像是 l $Zs~@N  
  getProtocol() vnZ/tF  
  getHost() Sip_~]hM  
  getFile() e7|d=W  
  getPort() Ar5JP_M`E  
*/ a71}y;W  
我们可以通过[font="Times]URL对文件或资源读取,也可以通过[font="Times]URLConnection读取,也可以通过这个写入数据限于[font="Times]cgi脚本。 )"~=7)~<^  
实践: UJwq n"Q^  
import java.net.*; k4mTZ}6E  
import java.io.*; +/_!P;I  
public class URLConnectionReader { h7RD `k:mF  
    public static void main(String[] args) throws IOException { 1gAc,s2  
      URL google = new URL(""); f#c BQ~  
      URLConnection g = google.openConnection(); O 3}P07  
      BufferedReader in = new BufferedReader(new InputStreamReader(g.getInputStream())); Y-7.Vjt^  
      String inputLine; Tvrc%L(]  
      while ((inputLine=in.readLine())!=null) P.1Qc)m4  
          System.out.println(inputLine); d!!3"{'  
          in.close(); T ~|PU{  
    }} 2dyxKK!\a  
URL和URLConnection类提供了较高层次的网络访问。有时候需要进行较低层次的访问。编写C/S模型的程序时,就要使用Socket通信机制了。因为在网络上不一定非得访问文件。 _<Vg[ -:1  
实践://先写个客户端的应用 b)y<.pS\  
import java.net.*; {4)5]62>u  
import java.io.*; )SD_}BY%k  
public class SimpleClient { |vT=Nnu  
  public static void main(String args[]) { vT}pbOTh  
    try { NIL^UN}  
      // 在5432端口打开服务器连接 qIk )'!Vk  
      // 在这里用localhost与127.0.0.1是一个意思 ]o!&2:'N`  
      Socket s1 = new Socket("127.0.0.1", 5432);  'F6#l"~/  
      // 对这个端口连接一个reader,注意端口不能够占用别的 Y?e3Bx7*b  
      BufferedReader br = new BufferedReader( bZnDd  
        new InputStreamReader(s1.getInputStream())); $"(3MnR  
      // 读取输入的数据并且打印在屏幕上 -%N}A3m!5  
      System.out.println(br.readLine()); rZ 6@b  
      //当完成时关闭流和连接 jaNH](V  
      br.close(); a6 * Y%?  
      s1.close(); {cX7<7N  
    } catch (ConnectException connExc) { B8>FCF&}E  
      System.err.println("Could not connect to the server."); 2nYiG)tg  
    } catch (IOException e) { "$4hv6 s  
      // ignore GdL4|xv  
    }}} B~e7w 4  
//这是服务端的应用 U(8I+xZ  
import java.net.*; 25w6KBTe;:  
import java.io.*; _"`uqW79  
public class SimpleServer { H8x:D3C0  
  public static void main(String args[]) { 1=- X<M75  
    ServerSocket s = null; ap{{(y&R  
    // 注册服务端口为5432 H|x k${R`  
    try { X.:_"+I;  
      s = new ServerSocket(5432); w7Pe  
    } catch (IOException e) { s}<)B RZi  
      e.printStackTrace(); B##C{^5A`  
    } P'gT6*an,"  
  // 运行监听器并接收,永远循环下去。因为服务器总要开启的 <"{+  
    while (true) { 5auL<Pq   
      try { }]Qmt5'NI  
        // 等待一个连接的请求 >DkN+S  
        Socket s1 = s.accept(); bmSpbX\  
        // 得到端口的输出流 <w%Yq?^  
        OutputStream s1out = s1.getOutputStream(); sCL/pb]  
        BufferedWriter bw = new BufferedWriter( FC~|&  
          new OutputStreamWriter(s1out)); 18J.vcP  
        // 发送一个字符串 JJ*0M(GG  
        bw.write("百家拳软件项目研究室欢迎您!\n"); ^glbxbhI4  
        // 关闭这个连接, 但不是服务端的socket 1h& )I%`?  
        bw.close(); P=}H1 #  
        s1.close(); Py}!C@e  
      } catch (IOException e) { t>m8iS>  
        e.printStackTrace(); 8rnb  
      }}}}上述例子打包下载 AW]("pt  
执行这个程序和其它的不太一样,先用javac将两个文件编译之后。然后敲start开启另一个窗口。用start命令开启的窗口继承了原来窗口的特性。如图26-1所示 \>w@=bq26  
EgkZ$ah  
图26-1 G >I.  
接着在原来的窗口上执行服务端程序java SimpleServer.在新窗口中执行java SimpleClient 就会看到结果了。注意如果如果在启动服务端的时候抛出bindException则说明5432这个端口已经被别的程序占用着,改成别的端口号就可以了。通常选用端口的时候,其数字最好不要小于1024,1024一下的端口很多都是专用的端口。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 24 发表于: 2007-10-10
全新java初学者实践教程25(java SE5.0版) @$K![]oD  
多线程 :*^(OnIe  
i2`.#YJ&v  
)dUd`g  
[font="Times]Java语言中有一个重要的特性是支持多线程。多线程是[font="Times]java的一项高级技术,它涉及到操作系统里面的知识,层次贴近系统层面。对于普通程序员一般很少碰它。而且目前就是在[font="Times]java EE(原来的[font="Times]J2EE)的相关框架里,对线程这个东西都是尽量回避。程序员最理想的状态是专注业务逻辑,而不是天天想着线程这个东西怎么写。 ;+aDjO2(  
[font="Times]    思考一个问题程序的本质是什么?是[font="Times]CPU的指令序列的集合。到底什么顺序是程序员编写的让计算机赋值,它就赋值、写个循环它就循环、写个分支语句它就分支、写个跳转它就跳转。每个指令流就是一个线程,并发执行多个指令流就是多线程。大家想,只有一个[font="Times]CPU怎么可能同时发出多个指令流呢?是的,并发只是“逻辑”上的,物理上是不可能的除非是两个以上的[font="Times]CPU。 <yX@@8  
多线程和传统的单线程的区别是由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,出现了并发访问带来的一切问题。正像是三个和尚的故事,和尚多了未必是好事。也就是刚才说的,程序员一般都不让他们碰这个东西。 A`+(VzZgJ  
[font="Times]    在[font="Times]java中如何写线程呢,在[font="Times]java中就是很简单了。有两种方法:第一、继承[font="Times]java.lang.Thread第二、实现[font="Times]Runnable接口。 R|cFpRe  
实践: PaU@T!v  
[font="Times]//继承[font="Times]Thread而重写了[font="Times]run()方法 t*ri`}a{v  
public class Hello extends Thread{ %-0em!tUV  
    int i; #8WR{  
    public void run(){ a78;\{&L'  
      while(true){ c +"O\j'  
          System.out.println("Hello "+i++); PW~cqo B71  
          if(i==10) break; .q~,.yI&j  
      }}} RBHqLg(  
public class HelloThread { YGZAtSf3z  
    public static void main(String[] args){ }lr fO_  
      Hello h1 = new Hello(); bUZ&}(/  
      Hello h2 = new Hello(); [hvig$L  
      h1.start(); [font="Times]//用两个线程执行那[font="Times]10次循环 K!$\REs  
      h2.start(); y.TdWnXx  
}} PHE;  
上面的例子是第一种方法,下面是第二种方法 +9=p*3cnp  
public class TestThread { 3XYIbXnk  
  public static void main(String args[]) { yE!7`c.[u  
    Xyz r = new Xyz(); Xs#?~~"aC  
    Xyz r1 = new Xyz(); gFH;bZU  
    Thread t1 = new Thread(r); V2<k0@y  
    Thread t2 = new Thread(r1); =~(LJPo6  
    t1.start();[font="Times]//用两个线程执行那[font="Times]50次循环 yF [@W<  
    t2.start(); H/ B^N,oi  
}}[font="Times] XO8 H]  
//实现[font="Times]Runnable接口 "pKGUM  
class Xyz implements Runnable { 1^Y:XJ73  
  int i; ,vHX>)M|  
  public void run() { %\s#e  
    i = 0; tjc5>T[Es8  
    while (true) { J OL Z2  
      System.out.println("Hello " + i++); !W6    
      if ( i == 50 ) { *N&^bF"SF  
    break; Yg:74; .  
}}}} }f0^9(  
多个源码打包下载 oM? C62g\  
$`+~QR!h  
    上面两种方法继承Thread类,是比较简单的,代码也比较少。但是我们不提倡使用这种方法。而第二种实现Runnable接口,更符合面向对象思想,Thread是把虚拟的CPU看成一个对象,封装了CPU的细节。但是Thread的构造线程的子类的方法中与CPU不相关,没有必要把CPU的细节都继承来。而实现Runnable则不影响java.lang.Thread的体系。而且便于其它类的继承。 F".IB^} $  
    线程并发的代码和数据的执行顺序混乱,我们也需要自己调度和控制它们。请看附加教程,线程调度和并发。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 23 发表于: 2007-10-10
全新java初学者实践教程24(java SE5.0版) %lq7; emtp  
反射 5qAE9G!c  
2H32wpY ,l  
9FR1Bruf  
还是那样的,[font="Times]java的概念就是多,有时候多的还没等你反应过来又给你出来一个新的概念。反射是个很重要的概念,这是一种机制,不只是[font="Times]java里面有,很多语言里面都有。这个概念是一个叫[font="Times]Smith的大师,由[font="Times]1982年提出来的。指的是一类应用,它们能够自描述和自控制。这样说太抽象了。我们看个例子,实践: ]Rys=.!  
import[font="Times] java.lang.reflect.*; dA!f v`,6-  
public class[font="Times] Refl { HT;QepY3  
[font="Times]    public static void [font="Times]main(String args[]) { UY?]\4Om  
[font="Times]        try [font="Times]{ D;;o  
[font="Times]      //这是反射的一种方式。将类在运行时自动加载进来 ?@uK s4  
[font="Times]            Class c = Class.forName(“java.lang.String”); :."n@sA@  
[font="Times]    // getDeclaredMethods()获取这个类中定义了的方法列表 Dg2#Gv0B  
[font="Times][font="Times]            Method m[] = c.getDeclaredMethods(); [3 ;Y:&D  
[font="Times]            for[font="Times] (int i = 0; i aN);P>  
[font="Times]              System.out.println[font="Times](m.toString()); ]oZ,{Q5~  
[font="Times]        } catch[font="Times] (Throwable e) { i|! 9o:  
[font="Times]            System.err.println[font="Times](e); sMe~C>RD  
[font="Times]        }}}  "%@=?X8  
执行的时候发现输出了,[font="Times]String 类的所有方法打印了出来。重要的是,[font="Times]Class.forName这句话它是反射的一种方式。就是在运行时改变[font="Times]Refl类的状态,通过[font="Times]”java.lang.String”改变。 GlkAJe]  
[font="Times]Java语言提供了一套反射类,[font="Times]java.lang.reflect.*;这些类可以用做: pU)3*9?cIl  
l        构造新类实例和新数组 -<HvhW  
l        访问并修改对象([font="Times]Object)和类的字段[font="Times](Field) QH? 2v  
l        调用对象和类中的方法([font="Times]Method) yl]Cm?8  
l        访问并修改数组的元素[font="Times] Ss#{K;  
[font="Times]    反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉[font="Times]JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。一边执行的时候,一边加载其它类,肯定会慢的。但是它有很强的扩展性,具有开放性的系统很多都采用这种机制,因为在安全允许的情况下它可以随意加载类,和调用方法。在[font="Times]windows编程里面的[font="Times]dll与它几乎是一个意思。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 22 发表于: 2007-10-10
全新java初学者实践教程23(java SE5.0版) :usBeho  
序列化 MM)/B>cQt  
ykl=KR  
]R.Vq\A%S  
上节课我们讲了[font="Times]4种流,只有序列化的这个没有细讲。它是传对象的,如果想把一个对象保存在硬盘上,就只能使用这种方式。它的关键是将它的状态以一种串行格式表示出来,以便以后读该对象时能够把它读出来。对象的串行化对于大多数[font="Times]java应用是非常重要的: vWU4ZBT8G  
      [font="Times]◆Java的远程方法调用[font="Times](RMI),通过[font="Times]socket通信。这个东西我们会在后面的教程讲到。 Tqh Rs  
  ◆ 对象永久化,就是把对象存硬盘上,或外存设备上。以便以后使用。 uN^qfJ'@ >  
它的基础类是[font="Times]ObjectInputStream和[font="Times]ObjectOutputStream,这两个流称为对象流。 *[/Xhx"  
[font="Times]      实践: //这是一个保存对象的例子 4]Nr$FY  
import java.io.*; 3ncvM>~g  
import java.util.Date; vM;dPE7  
public class SerializeDate { 6L% R@r  
  SerializeDate() { [#h!3d|?B  
    Date d = new Date (); oUS>p":  
JM4`k8mM  
    try { )C0X]?   
      FileOutputStream f = @<{ #v.T  
          new FileOutputStream ("date.ser"); //输出到date.ser这个文件中 wI]>0geb*  
      ObjectOutputStream s = hp%Pg &  
          new ObjectOutputStream (f); lcJumV=%>  
      s.writeObject (d); //写对象,将对象d写成是date.ser文件 XA^:n+Yo  
      s.close ();        //关闭流 X#C7r@H  
    } catch (IOException e) { X{5DPhB,  
      e.printStackTrace (); jWm BUHCb  
    } } *LQY6=H  
  public static void main (String args[]) { L6}x3  
    new SerializeDate(); [5d][1=  
  }} 5'[X&r %#  
如图所示23-1,执行之后 ?)<XuMh  
图23-1 xb_:9   
在DOS窗口中没有看到结果,但是在这个文件夹内发现了一个date.ser的文件。它就是对象d写入磁盘的状态。 a^1c _  
如图23-2 I*ni)Px  
rKO*A7vE  
图23-2 %QZ!Tb  
那么保存了之后怎么在把这个date.ser文件读出来呢? Ln -?/[E  
实践: ~ab_+%  
import java.io.*; +>%+r  
import java.util.Date; )Ea_:C'  
public class UnSerializeDate { M!i5StGC  
  UnSerializeDate () { W3j|%  
    Date d = null; l[0P*(I,  
    try { //使用FileInputStream类 6spk* 8e  
      FileInputStream f = 6M|%nBN$|  
          new FileInputStream ("date.ser"); c<x6_H6[8  
      ObjectInputStream s = HcUz2Rm5XP  
          new ObjectInputStream (f); K1WoIv<Ym  
      d = (Date) s.readObject ();//读对象 uzA'D~)P  
      s.close (); @z RB4d$  
    } catch (Exception e) { 4}FfHgpQ  
      e.printStackTrace (); } +Y[+2=lO  
    System.out.println( 0'}?3/u-  
      "从date.ser文件,读取Date对象 "); ==r|]~x  
    System.out.println("日期是: "+d); NX",e=  
  } !\ukb  
  public static void main (String args[]) { 6-YR'ikU  
    new UnSerializeDate(); Wm&f+{LO+K  
  }}如图23-3所示读出时间 +# >%bq x  
AWNd(B2o  
图23-3 . +?lID  
上述源码打包下载 ;MI<J>s  
对于一个可以被序列化的类,它会实现一个Serializable的接口。那是个空接口,什么方法也没有只是一个标志而已。这在J2EE,(现在叫java EE)中,使用EJB时是非常重要的。如果大家以后能继续学习学到EJB的时候,再具体了解。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 21 发表于: 2007-10-10
全新java初学者实践教程22(java SE5.0版) #^V"=RbD  
输入/输出 4et#Q  
^)pY2t<^  
+60;z4y}w  
输入[font="Times]/输出([font="Times]I/O)是每一项计算机语言,必须有的东西。不让人输入数据的话,计算机怎么处理数据呢?在[font="Times]java语言中,[font="Times]I/O的方式是流的方式。流([font="Times]stream)这是个学习[font="Times]java输入输出的最基本的概念。 rXX|?9 '  
                                                      1ouTZ'c?  
    流是字节从源到目的的有序序列。一方面是字节,一方面是有序的。流描述的是一个过程,顺序严格。一个需要键盘输入的程序可以用流来做到这一点。两种基本的流是:输入流和输出流。你可以从输入流读,但你不能对它写。要从输入流读取字节,必须有一个与这个流相关联的字符源。这些东西都放在java.io.*这个包里了。 z\5Nni/~6D  
    io是java的第一大包。在[font="Times]java.io 包中,有一些流是结点流,即它们可以从一个特定的地方读写,例如磁盘或者一块内存。其他流称作过滤流。一个过滤器输入流是用一个到已存在的输入流的连接创建的。此后,当你试图从过滤输入流对象读时,它向你提供来自另一个输入流对象的字符。 0wcWDE 9  
  常见的几种流: Q[KR,k  
[font="Times] _@TTVd  
    ◆  字节流:传字节的。以8位字节为单位进行读写,以InputStream与OutputStream为基础类 l$KcS&{w9  
    ◆  字符流: 传字符的。以16位字符为单位进行读写,以Reader与Writer为基础类 +rY0/T_0,  
    ◆  文件流: 传文件的。属于节点流,对文件读写,传输。里面的类很多。 9U*vnLB  
    ◆  序列化:传对象的。一个对象怎么读啊,只有变成二进制才可以读,这就是序列化。 M8}M*\2  
实践: //这是一个字节流的例子,以InputStream与OutputStream为基础类 b4ivWb|`  
import java.io.*; X>>rvlDN  
class ByteArrayOutputStreamDemo { xw H`alu  
    public static void main(String args[]) throws IOException { WG{/I/bJ_  
    ByteArrayOutputStream f = new ByteArrayOutputStream(); mio'm  
    String s = "This should end up in the array"; cf'Z#NfQ  
    byte buf[] = s.getBytes(); 2[hl^f^%,  
    f.write(buf); OpE+e4~IF  
        System.out.println("Buffer as a string"); T5;D0tM/  
        System.out.println(f.toString()); m`"s$\fah  
        System.out.println("Into array"); KA#-X2U/  
    byte b[] = f.toByteArray(); iH=@``Z  
  -;*Z!|e9  
    for (int i=0; i Mw. +0R!T  
        System.out.print((char) b);} ;8Cqy80K  
        System.out.println("\nTo an OutputStream()"); .Ps;O  
        //输出到文件test.txt中 Yw<:I&  
        OutputStream f2 = new FileOutputStream("test.txt"); zL'n J  
        f.writeTo(f2); k5YDqG n'q  
        f2.close(); W=m_G]"L  
        System.out.println("Doing a reset"); |M_Bbo@ud  
        f.reset(); 48`<{|r{  
    for (int i=0; i 1<"kN^  
    f.write('X'); 9E+lriyY  
        System.out.println(f.toString());}} uzsN#'7=  
//字符流的例子,以Reader与Writer为基础类 ;4IP7$3G  
import java.io.*; B!v1 gh  
public class CharArrayReaderDemo { \m!."~%  
  public static void main(String args[]) throws IOException { 'z'm:|JW  
  urB.K<5ZA  
  String tmp = "abcdefghijklmnopqrstuvwxyz"; zZHsS$/  
  int length = tmp.length(); AF-.Nwp   
  char c[] = new char[length]; R YNz TA  
  tmp.getChars(0, length, c, 0); !@X#{  
  CharArrayReader input1 = new CharArrayReader(c); o_n.,=/cZ  
  CharArrayReader input2 = new CharArrayReader(c, 0, 5); yw0uF  
  HApP*1J^c  
  int i; w[ngkLEA  
      System.out.println("input1 is:"); @\R)k(F  
  while((i = input1.read()) != -1) { ^-_!:7TH]  
      System.out.print((char)i);} (XH)1 -Z!  
      System.out.println(); zU%aobZ  
      System.out.println("input2 is:"); `ijX9c  
  while((i = input2.read()) != -1) { \ck3y]a[  
      System.out.print((char)i);} {Hv=iVmt  
      System.out.println(); !l|Qyk[  
  }} 4$"Lf'sH6  
//文件流的例子 PhS"tOGtX  
import java.io.*; 'Bx7b(xqk  
class FileInputStreamDemo { {TNAK%'v  
  public static void main(String args[]) throws Exception { s7?kU3 y=s  
  int size; ~6nQ-  
  InputStream f = F t}tIP7  
  new FileInputStream("FileInputStreamDemo.java"); wSK?mS6  
      System.out.println("Total Available Bytes: " + hbK+\X  
      (size = f.available())); ElAG~u?  
  int n = size/40; e|LXH/H  
      System.out.println("First " + n + ORoraEK  
      " bytes of the file one read() at a time"); 5a/)|  
  for (int i=0; i QQ9Q[c  
      System.out.print((char) f.read()); rSk $]E]Z  
      } S;g~xo  
      System.out.println("\nStill Available: " + f.available()); ?cvv!2B]T  
      System.out.println("Reading the next " + n + {IVqV6:  
      " with one read(b[])"); b/EvcN8 }  
  byte b[] = new byte[n]; )+G(4eIT  
  if (f.read(b) != n) { `uj`ixcR  
      System.err.println("couldn't read " + n + " bytes."); =bzTfki  
      } \Mi< ROp5  
      System.out.println(new String(b, 0, n)); N?XN$hwdZ  
      System.out.println("\nStill Available: " + (size = f.available())); w <ID<  
      System.out.println("Skipping half of remaining bytes with skip()"); N%a[Y  
  f.skip(size/2); ZS-9|EA<  
      System.out.println("Still Available: " + f.available()); ~"N]%Cu  
      System.out.println(" Reading " + n/2 + " into the end of array"); 3,?y !  
  if (f.read(b, n/2, n/2) != n/2) { {e^llfj$#  
      System.err.println("couldn't read " + n/2 + " bytes."); Tla*V#:Ve  
      } vB p5&*  
      System.out.println(new String(b, 0, b.length)); k|V{jB G"@  
      System.out.println("\nStill Available: " + f.available()); 580t@?  
  f.close(); =h)H`  
  } +CkK4<dF  
} q )[g VL  
12个例子打包下载 ;H^!yj5H  
代码很多如有不明白的地方请访问技术论坛, 还有序列化的例子没有举出,序列化在java中是个很重要的概念哦。我们下节课。具体举例讲解。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 20 发表于: 2007-10-10
全新java初学者实践教程21(java SE5.0版) [Y*UCFhI0  
自定义异常类 =p"0G%+%  
^c5(MR7LD  
Eq?o /'e  
上节课留下了一个概念,自定义异常类。为什么要自己编写异常类,上节课做了简要的说明。如果[font="Times]jdk里面没有提供的异常,我们就要自己写。我们常用的类ArithmeticException,NullPointerException,NegativeArraySizeException,ArrayIndexoutofBoundsException,SecurityException这些类,都是继承着RuntimeException这个父类,而这个父类还有一个父类是Exception。那么我们自己写异常类的时候,也是继承Exception这个类的。 tx@Q/ou`\P  
实践: pmS=$z;I  
class MyException extends Exception { [font="Times]//继承了[font="Times]Exception这个父类 n'gfB]H[  
private int detail; ?`r/_EKNv  
MyException(int a) { fq(e~Aqw$  
detail = a;} f6XWA_[i@  
public String toString() { uO6_lOT9n  
return "MyException[" + detail + "]"; S8y4 p0mV  
}} ";~#epPkX  
/[q@=X&  
class ExceptionDemo { ,[~EThcq  
static void compute(int a) throws MyException { *<@  
System.out.println("调用 compute(" + a + ")"); `/U:u9H9v  
if(a > 10) Gc'H F"w  
throw new MyException(a); !cpBX>{w  
System.out.println("常规退出 "); >|s=l`"Xz  
} j@DyWm/7  
public static void main(String args[]) { 0nS6<:  
try { IE6/ E  
compute(1); @dXf_2Tv=  
compute(20); Cfj*[i4  
} catch (MyException e) { `{/=i|6  
System.out.println("捕捉 " + e);[font="Times] //这样就可以用自己定义的类来捕捉异常了 z23KSPo  
}}} yH`xk%q_  
   84{<]y  
像是上节课我们说了,如果你开发程序用到好多组件,或其它厂商的东西。那么出现的异常会是莫明其妙的,这样的话会给调试带来很大的不便。往往在开发的过程中会写很多自定义的异常类。 N 8OPeY  
  UY+~xzm  
总结: 8,R]R=  
  异常处理机制是保证java程序正常运行、具有较高安全性的重要手段。对于开发良好的编程习惯是非常重要的。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

只看该作者 19 发表于: 2007-10-10
全新java初学者实践教程20(java SE5.0版) C{Zv.+F  
异常处理 /j^zHrLN  
GZ e )QH  
?=vwr,ir  
3o?Lz7L  
    异常处理是个很重要的概念,很多语言中都对异常处理下了很大的功夫。如果你的语法没有写错,编译器是不会报错,而且编译成功。如果编译成功后,运行时发生了错误该怎么处理呢?例如我要加载一个类,而这个类被删了。这种情况就是异常。我们采用[font="Times]try..catch..finally语句作为处理方式。举个异常处理的例子吧。实践: "6}+|!"$  
                                                                                (-#{qkA  
public class[font="Times] TestExceptions { 9W8Dp?:  
[font="Times]  public static void[font="Times] main(String[] args) { S\,{ qhd  
[font="Times]    for[font="Times] ( int[font="Times] i = 0; true[font="Times]; i++ ) { zEGwQp<  
[font="Times]      System.out.println[font="Times]("args[" + i + "] is '" + args + "'"); gV7o eZ5  
[font="Times]    } }} q8D1MEBL`  
在这里面[font="Times]main方法的参数[font="Times]args是个字符串型的数组,在执行的时候要输入 [brrziZ  
[font="Times]java TestExceptions 100jq ERZ[t\g)  
后面的就是参数[font="Times]args[0]就是第一个参数。我们输入[font="Times]java TestException是出现了错误。如图[font="Times]20-1所示: qvscf_%FM  
N.<hZ\].=  
这上说的是数组边界溢出异常,第[font="Times]0个产生错误,因为根本就没有[font="Times]args[0],这个元素。 c;e ,)$)-|  
我们再敲一下[font="Times]java TestExceptions 100jq 如图[font="Times]20-[font="Times]1所示, ?BRL;(x  
u>eu47"n!  
    输出了[font="Times]args[0]没有异常了,并且输出了。而循环到[font="Times]i=[font="Times]1时,又发生异常。我们再输入两个参数[font="Times]java TestExceptions 100jq  [font="Times]www.100jq.com[font="Times] 这回两个参数了。同样的道理,[font="Times]args[2]发生异常。 #i,O "`4  
那么我们如何来捕捉这个异常呢,我们对上述代码做一下简单的修改。实践: v:>P;\]r9M  
public class[font="Times] TestExceptions1 { 8 2qe|XD4p  
[font="Times]  public static void [font="Times]main(String[] args) { f6#H@ X  
[font="Times]    try[font="Times] { p<jr&zVEc>  
[font="Times]      for[font="Times] ( int [font="Times]i = 0; true[font="Times]; i++ ) { -7`J(f.rYC  
[font="Times]      System.out.println[font="Times]("args[" + i + "] is '" + args + "'"); 4{R`  
[font="Times]      } n5 i}J/Sa2  
[font="Times]    } catch[font="Times] (ArrayIndexOutOfBoundsException e) { k8ck#%#}Wu  
[font="Times]      System.out.println[font="Times]("异常捕捉[font="Times]: " + e); 0 QpWt  
[font="Times]    System.out.println[font="Times]("退出[font="Times]..."); Z/x1?{z  
[font="Times]    } }} 9D<HJ(  
      这回输入刚才那两个参数的话,就不会出现那一堆难懂的英文了。异常已经在我们的掌控之中。否则,有很多异常是足够使内存导毁的。 <uvshZ v  
这里面我们只使用了[font="Times]try…catch 哪个地方你觉得它有毛病,你就[font="Times]try哪。但是[font="Times]try然后,要[font="Times]catch(捕捉[font="Times])的。如果事先你想不出它会发生什么异常的话,就用[font="Times]finally。实践: E%e-R6gl  
class[font="Times] FinallyDemo { Q4x71*vy  
static void[font="Times] procA() { ovohl<o\  
try [font="Times]{ zM'-2,  
System.out.println[font="Times]("inside procA"); Nh))U  
throw new [font="Times]RuntimeException("demo"); XVfQscZe  
[font="Times]} finally [font="Times]{ Hke\W'&  
System.out.println[font="Times]("procA's finally"); b-Hn=e_  
[font="Times]} =VU2#O  
[font="Times]} DkIkiw{L  
[font="Times]// 从[font="Times]try程序块内返回 n&fV3[m`2  
static void [font="Times]procB() { g:EU\  
try { B/71$i   
System.out.println[font="Times]("inside procB"); m|k,8guG  
return; 7Av]f3Zr  
[font="Times]} finally [font="Times]{ //结束 4Y2>w  
System.out.println[font="Times]("procB's finally"); `zL9d lZ  
[font="Times]} J]UH q$B  
[font="Times]} '3Ri/V,  
[font="Times]// 执行一个[font="Times]try程序块 #&Ee5xM=  
static void[font="Times] procC() { "xOeBNRjV  
try[font="Times] { VX%+!6+fS  
System.out.println[font="Times]("inside procC"); Ixw,$%-]y6  
[font="Times]} finally[font="Times] { ;1%a:#5  
System.out.println[font="Times]("procC's finally"); )&9RoW()?  
[font="Times]}  #59zv=  
[font="Times]} j;3o9!.s:  
public static void[font="Times] main(String args[]) { wB^a1=C  
try [font="Times]{ PjHm#a3zg%  
[font="Times]procA(); 9V&LJhDQ  
[font="Times]} catch [font="Times](Exception e) { N9Ml&*%oX{  
System.out.println[font="Times]("异常捕捉[font="Times]"); [h1{{Nb#ez  
[font="Times]} sF$m?/Kt  
[font="Times]procB(); D4\I;M^  
[font="Times]procC(); ]Oy<zU  
[font="Times]} -O5m@rwt<  
[font="Times]} KkY22_{ac  
上述源码打包下载 R4/@dA0  
如果将方法里抛出异常抛出,使用[font="Times]throws关键字[font="Times] public void abc() throws exception 也是要用[font="Times]catch来捕捉的。实践: Ir'f((8:  
[font="Times]class ThrowDemo { (0+m&, z  
[font="Times]static void demoproc() { a|NU)mgEI  
[font="Times]try { iCS/~[  
[font="Times]throw new NullPointerException("demo"); [OcD#~drO  
[font="Times]} catch(NullPointerException e) { riL!]'akV  
[font="Times]System.out.println("Caught inside demoproc."); |#wz)=mD  
[font="Times]throw e; //重新抛出异常[font="Times] }} [xPE?OD  
[font="Times]public static void main(String args[]) { A@ME7^w7  
[font="Times]try { 5*AKl< Jl  
[font="Times]demoproc(); `9-Zg??8r  
[font="Times]} catch(NullPointerException e) { wOOPWwk  
[font="Times]System.out.println("Recaught: " + e); |>4{4  
[font="Times]}}} 19个源码打包下载 \K6J{;#L  
异常类除了[font="Times]jdk提供我们的那些之外,我们自己还可以自定义的。[font="Times]Jdk提供的刚才我们已经见过几个了[font="Times] ArrayIndexOutOfBoundsException(数组边界溢出),[font="Times]NullPointerException(空指针异常)。要是[font="Times]jdk没有的,我们只有自己定义了。比如说我们现在要用[font="Times]XML开发,那么[font="Times]jdk没有写这方面的异常类,我们就得自己写一个关于[font="Times]XML的异常了。我们下节课讲自定义异常类。

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
10+5=?,请输入中文答案:十五