﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jody-随笔分类-Java语言基础</title><link>http://www.blogjava.net/Jody/category/9257.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 02:30:52 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 02:30:52 GMT</pubDate><ttl>60</ttl><item><title>java多线程</title><link>http://www.blogjava.net/Jody/archive/2006/08/03/61539.html</link><dc:creator>zhaofei1394</dc:creator><author>zhaofei1394</author><pubDate>Thu, 03 Aug 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/Jody/archive/2006/08/03/61539.html</guid><wfw:comment>http://www.blogjava.net/Jody/comments/61539.html</wfw:comment><comments>http://www.blogjava.net/Jody/archive/2006/08/03/61539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jody/comments/commentRss/61539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jody/services/trackbacks/61539.html</trackback:ping><description><![CDATA[首先要理解线程首先需要了解一些基本的东西，我们现在所使用的大多数操作系统都属于多任务，分时操作系统。正是由于这种操作系统的出现才有了多线程这个概念。我们使用的windows,linux就属于此列。什么是分时操作系统呢，通俗一点与就是可以同一时间执行多个程序的操作系统，在自己的电脑上面，你是不是一边听歌，一边聊天还一边看网页呢？但实际上，并不上cpu在同时执行这些程序，cpu只是将时间切割为时间片，然后将时间片分配给这些程序，获得时间片的程序开始执行，不等执行完毕，下个程序又获得时间片开始执行，这样多个程序轮流执行一段时间，由于现在cpu的高速计算能力，给人的感觉就像是多个程序在同时执行一样。<br />一般可以在同一时间内执行多个程序的操作系统都有进程的概念.一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源.在进程概念中,每一个进程的内部数据和状态都是完全独立的.因此可以想像创建并执行一个进程的系统开像是比较大的，所以线程出现了。在java中，程序通过流控制来执行程序流,程序中单个顺序的流控制称为线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务.多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行.（你可以将前面一句话的程序换成进程，进程是程序的一次执行过程,是系统运行程序的基本单位）<br /><br />线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程也被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程.<br /><br />多任务是指在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程，同进程一样,一个线程也有从创建,运行到消亡的过程,称为线程的生命周期.用线程的状态(state)表明线程处在生命周期的哪个阶段.线程有创建,可运行,运行中,阻塞,死亡五中状态.通过线程的控制与调度可使线程在这几种状态间转化每个程序至少自动拥有一个线程,称为主线程.当程序加载到内存时,启动主线程.<br /><br />[线程的运行机制以及调度模型] <br />java中多线程就是一个类或一个程序执行或管理多个线程执行任务的能力，每个线程可以独立于其他线程而独立运行，当然也可以和其他线程协同运行，一个类控制着它的所有线程，可以决定哪个线程得到优先级，哪个线程可以访问其他类的资源，哪个线程开始执行，哪个保持休眠状态。<br />下面是线程的机制图：<br /><img onmouseover="javascript:imgShowTip(this);" style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200604/20060404144316962.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务.线程有创建,可运行,运行中,阻塞,死亡五中状态.一个具有生命的线程,总是处于这五种状态之一：<br /><b>1.创建状态</b><br />使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)<br /><b>2.可运行状态</b><br />使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)<br /><b>3.运行中状态</b><br />Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running).此时,系统真正执行线程的run()方法.<br /><b>4.阻塞状态</b><br />一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)<br /><b>5.死亡状态</b><br />线程结束后是死亡状态(Dead)<br /><br />同一时刻如果有多个线程处于可运行状态,则他们需要排队等待CPU资源.此时每个线程自动获得一个线程的优先级(priority),优先级的高低反映线程的重要或紧急程度.可运行状态的线程按优先级排队,线程调度依据优先级基础上的"先到先服务"原则.<br />线程调度管理器负责线程排队和CPU在线程间的分配,并由线程调度算法进行调度.当线程调度管理器选种某个线程时,该线程获得CPU资源而进入运行状态.<br /><br />线程调度是先占式调度,即如果在当前线程执行过程中一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行.先占式调度分为:独占式和分时方式.<br />独占方式下,当前执行线程将一直执行下去,直 到执行完毕或由于某种原因主动放弃CPU,或CPU被一个更高优先级的线程抢占<br />分时方式下,当前运行线程获得一个时间片,时间到时,即使没有执行完也要让出CPU,进入可运行状态,等待下一个时间片的调度.系统选中其他可运行状态的线程执行<br />分时方式的系统使每个线程工作若干步,实现多线程同时运行<br /><br />另外请注意下面的线程调度规则（如果有不理解，不急，往下看）：<br />①如果两个或是两个以上的线程都修改一个对象，那么把执行修改的方法定义为被同步的（Synchronized）,如果对象更新影响到只读方法，那么只度方法也应该定义为同步的<br />②如果一个线程必须等待一个对象状态发生变化，那么它应该在对象内部等待，而不是在外部等待，它可以调用一个被同步的方法，并让这个方法调用wait()<br />③每当一个方法改变某个对象的状态的时候，它应该调用notifyAll()方法，这给等待队列的线程提供机会来看一看执行环境是否已发生改变<br />④记住wait(),notify(),notifyAll()方法属于Object类，而不是Thread类，仔细检查看是否每次执行wait()方法都有相应的notify()或notifyAll()方法，且它们作用与相同的对象 在java中每个类都有一个主线程，要执行一个程序，那么这个类当中一定要有main方法，这个man方法也就是java class中的主线程。你可以自己创建线程，有两种方法，一是继承Thread类，或是实现Runnable接口。一般情况下，最好避免继承，因为java中是单根继承，如果你选用继承，那么你的类就失去了弹性，当然也不能全然否定继承Thread,该方法编写简单,可以直接操作线程,适用于单重继承情况。至于选用那一种，具体情况具体分析。<br /><br /><br /><b>eg.继承Thread</b><br /><pre class="overflow">public class MyThread_1 extends Thread<br />{<br />public void run()<br />{<br />//some code <br />}<br />}</pre><br /><br /><b>eg.实现Runnable接口</b><br /><pre class="overflow">public class MyThread_2 implements Runnable<br />{<br />public void run()<br />{<br />//some code <br />}<br />}</pre><br /><br /><br />当使用继承创建线程，这样启动线程：<br /><pre class="overflow">new MyThread_1().start()</pre><br /><br />当使用实现接口创建线程，这样启动线程：<br /><pre class="overflow">new Thread(new MyThread_2()).start()</pre><br /><br />注意，其实是创建一个线程实例，并以实现了Runnable接口的类为参数传入这个实例，当执行这个线程的时候，MyThread_2中run里面的代码将被执行。<br />下面是完成的例子：<br /><br /><pre class="overflow">public class MyThread implements Runnable<br />{ <br /><br />public void run()<br />{ <br />System.out.println("My Name is "+Thread.currentThread().getName()); <br />} <br />public static void main(String[] args)<br />{<br />new Thread(new MyThread()).start(); <br />}<br />} </pre><br /><br /><br />执行后将打印出：<br /><span style="COLOR: blue">My Name is Thread-0</span><br /><br />你也可以创建多个线程，像下面这样<br /><pre class="overflow">new Thread(new MyThread()).start();<br />new Thread(new MyThread()).start();<br />new Thread(new MyThread()).start();</pre><br /><br /><br />那么会打印出：<br /><span style="COLOR: blue">My Name is Thread-0<br />My Name is Thread-1<br />My Name is Thread-2</span><br /><br />看了上面的结果，你可能会认为线程的执行顺序是依次执行的，但是那只是一般情况，千万不要用以为是线程的执行机制；影响线程执行顺序的因素有几点：首先看看前面提到的优先级别<br /><br /><br /><pre class="overflow">public class MyThread implements Runnable<br />{ <br /><br />public void run()<br />{ <br />System.out.println("My Name is "+Thread.currentThread().getName()); <br />} <br />public static void main(String[] args)<br />{<br />Thread t1=new Thread(new MyThread());<br />Thread t2=new Thread(new MyThread());<br />Thread t3=new Thread(new MyThread());<br />t2.setPriority(Thread.MAX_PRIORITY);//赋予最高优先级<br />t1.start();<br />t2.start();<br />t3.start();<br />}<br />} </pre><br /><br />再看看结果：<br /><span style="COLOR: blue">My Name is Thread-1<br />My Name is Thread-0<br />My Name is Thread-2</span><br /><br /><br />线程的优先级分为10级，分别用1到10的整数代表，默认情况是5。上面的t2.setPriority(Thread.MAX_PRIORITY)等价与t2.setPriority(10）<br />然后是线程程序本身的设计，比如使用sleep,yield,join，wait等方法（详情请看JDKDocument)<br /><br /><pre class="overflow">public class MyThread implements Runnable<br />{ <br />public void run()<br />{ <br />try<br />{<br />int sleepTime=(int)(Math.random()*100);//产生随机数字，<br />Thread.currentThread().sleep(sleepTime);//让其休眠一定时间，时间又上面sleepTime决定<br />//public static void sleep(long millis)throw InterruptedException （API）<br />System.out.println(Thread.currentThread().getName()+" 睡了 "+sleepTime);<br />}catch(InterruptedException ie)//由于线程在休眠可能被中断，所以调用sleep方法的时候需要捕捉异常<br />{<br />ie.printStackTrace();<br />} <br />} <br />public static void main(String[] args)<br />{<br />Thread t1=new Thread(new MyThread());<br />Thread t2=new Thread(new MyThread());<br />Thread t3=new Thread(new MyThread());<br />t1.start();<br />t2.start();<br />t3.start();<br />}<br />}</pre><br /><br />执行后观察其输出：<br /><br /><span style="COLOR: blue">Thread-0 睡了 11<br />Thread-2 睡了 48<br />Thread-1 睡了 69</span><br /><br /><br /><br />上面的执行结果是随机的，再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句，当线程休眠的时候就会让出cpu，cpu将会选择执行处于runnable状态中的其他线程，当然也可能出现这种情况，休眠的Thread立即进入了runnable状态，cpu再次执行它。<br />[线程组概念]<br />线程是可以被组织的，java中存在线程组的概念，每个线程都是一个线程组的成员,线程组把多个线程集成为一个对象,通过线程组可以同时对其中的多个线程进行操作,如启动一个线程组的所有线程等.Java的线程组由java.lang包中的Thread——Group类实现.<br />ThreadGroup类用来管理一组线程,包括:线程的数目,线程间的关系,线程正在执行的操作,以及线程将要启动或终止时间等.线程组还可以包含线程组.在Java的应用程序中,最高层的线程组是名位main的线程组,在main中还可以加入线程或线程组,在mian的子线程组中也可以加入线程和线程组,形成线程组和线程之间的树状继承关系。像上面创建的线程都是属于main这个线程组的。<br />借用上面的例子，main里面可以这样写：<br /><br /><pre class="overflow">public static void main(String[] args)<br />{<br />/***************************************<br />ThreadGroup(String name) <br />ThreadGroup(ThreadGroup parent, String name) <br />***********************************/<br />ThreadGroup group1=new ThreadGroup("group1");<br />ThreadGroup group2=new ThreadGroup(group1,"group2");<br />Thread t1=new Thread(group2,new MyThread());<br />Thread t2=new Thread(group2,new MyThread());<br />Thread t3=new Thread(group2,new MyThread());<br />t1.start();<br />t2.start();<br />t3.start();<br />}</pre><br /><br /><br />线程组的嵌套，t1,t2,t3被加入group2,group2加入group1。<br />另外一个比较多就是关于线程同步方面的，试想这样一种情况，你有一笔存款在银行，你在一家银行为你的账户存款，而你的妻子在另一家银行从这个账户提款，现在你有1000块在你的账户里面。你存入了1000，但是由于另一方也在对这笔存款进行操作，人家开始执行的时候只看到账户里面原来的1000元，当你的妻子提款1000元后，你妻子所在的银行就认为你的账户里面没有钱了，而你所在的银行却认为你还有2000元。<br />看看下面的例子：<br /><br /><pre class="overflow">class BlankSaving //储蓄账户<br />{<br />private static int money=10000;<br />public void add(int i)<br />{<br />money=money+i;<br />System.out.println("Husband 向银行存入了 [￥"+i+"]");<br />}<br />public void get(int i)<br />{<br />money=money-i;<br />System.out.println("Wife 向银行取走了 [￥"+i+"]");<br />if(money&lt;0)<br />System.out.println("余额不足！"); <br />}<br />public int showMoney()<br />{<br />return money;<br />}<br />} <br /><br /><br />class Operater implements Runnable<br />{<br />String name;<br />BlankSaving bs;<br />public Operater(BlankSaving b,String s)<br />{<br />name=s;<br />bs=b;<br /><br /><br /><br />}<br />public static void oper(String name,BlankSaving bs)<br />{<br /><br /><br /><br />if(name.equals("husband"))<br />{<br />try<br />{<br />for(int i=0;i&lt;10;i++)<br />{<br />Thread.currentThread().sleep((int)(Math.random()*300));<br />bs.add(1000);<br />}<br />}catch(InterruptedException e){}<br />}else<br />{<br />try<br />{<br /><br /><br /><br />for(int i=0;i&lt;10;i++)<br />{<br />Thread.currentThread().sleep((int)(Math.random()*300));<br />bs.get(1000);<br />}<br />}catch(InterruptedException e){}<br />}<br />}<br />public void run()<br />{<br />oper(name,bs);<br />} <br />}<br />public class BankTest <br />{<br />public static void main(String[] args)throws InterruptedException<br />{<br />BlankSaving bs=new BlankSaving();<br />Operater o1=new Operater(bs,"husband");<br />Operater o2=new Operater(bs,"wife");<br />Thread t1=new Thread(o1);<br />Thread t2=new Thread(o2);<br />t1.start();<br />t2.start();<br />Thread.currentThread().sleep(500);<br />}<br /><br /><br /><br />}</pre><br /><br /><br />下面是其中一次的执行结果：<br /><br /><br /><br /><span style="COLOR: blue">---------first--------------<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Husband 向银行存入了 [￥1000]</span><br /><br />看到了吗，这可不是正确的需求，在husband还没有结束操作的时候，wife就插了进来，这样很可能导致意外的结果。解决办法很简单，就是将对数据进行操作方法声明为synchronized,当方法被该关键字声明后，也就意味着，如果这个数据被加锁，只有一个对象得到这个数据的锁的时候该对象才能对这个数据进行操作。也就是当你存款的时候，这笔账户在其他地方是不能进行操作的，只有你存款完毕，银行管理人员将账户解锁，其他人才能对这个账户进行操作。<br />修改public static void oper(String name,BlankSaving bs)为public static void oper(String name,BlankSaving bs)，再看看结果:<br /><br /><span style="COLOR: blue">Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Husband 向银行存入了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]<br />Wife 向银行取走了 [￥1000]</span><br /><br /><br /><br />当丈夫完成操作后，妻子才开始执行操作，这样的话，对共享对象的操作就不会有问题了。<br />[wait and notify]<br />你可以利用这两个方法很好的控制线程的执行流程，当线程调用wait方法后，线程将被挂起，直到被另一线程唤醒（notify）或则是如果wait方法指定有时间得话，在没有被唤醒的情况下，指定时间时间过后也将自动被唤醒。但是要注意一定，被唤醒并不是指马上执行，而是从组塞状态变为可运行状态，其是否运行还要看cpu的调度。<br />事例代码：<br /><br /><pre class="overflow">class MyThread_1 extends Thread<br />{<br />Object lock;<br />public MyThread_1(Object o)<br />{<br />lock=o;<br />}<br />public void run()<br />{<br />try<br />{<br />synchronized(lock)<br />{<br />System.out.println("Enter Thread_1 and wait");<br />lock.wait();<br />System.out.println("be notified");<br />}<br />}catch(InterruptedException e){}<br />}<br />}<br />class MyThread_2 extends Thread<br />{<br />Object lock;<br />public MyThread_2(Object o)<br />{<br />lock=o;<br />}<br />public void run()<br />{<br />synchronized(lock)<br />{<br />System.out.println("Enter Thread_2 and notify");<br />lock.notify();<br />}<br />}<br />}<br />public class MyThread<br />{ <br />public static void main(String[] args)<br />{<br />int[] in=new int[0];//notice<br />MyThread_1 t1=new MyThread_1(in);<br />MyThread_2 t2=new MyThread_2(in);<br />t1.start();<br />t2.start();<br />}<br />}</pre><br /><br /><br /><br />执行结果如下：<br /><span style="COLOR: blue">Enter Thread_1 and wait<br />Enter Thread_2 and notify<br />Thread_1 be notified</span><br /><br />可能你注意到了在使用wait and notify方法得时候我使用了synchronized块来包装这两个方法，这是由于调用这两个方法的时候线程必须获得锁，也就是上面代码中的lock[]，如果你不用synchronized包装这两个方法的得话，又或则锁不一是同一把，比如在MyThread_2中synchronized(lock)改为synchronized(this),那么执行这个程序的时候将会抛出java.lang.IllegalMonitorStateException执行期异常。另外wait and notify方法是Object中的，并不在Thread这个类中。最后你可能注意到了这点：int[] in=new int[0];为什么不是创建new Object而是一个0长度的数组，那是因为在java中创建一个0长度的数组来充当锁更加高效。<br /><br />Thread作为java中一重要组成部分，当然还有很多地方需要更深刻的认识，上面只是对Thread的一些常识和易错问题做了一个简要的总结，若要真正的掌握java的线程，还需要自己多做总结 <img src ="http://www.blogjava.net/Jody/aggbug/61539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jody/" target="_blank">zhaofei1394</a> 2006-08-03 17:02 <a href="http://www.blogjava.net/Jody/archive/2006/08/03/61539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 实用的一些技巧 </title><link>http://www.blogjava.net/Jody/archive/2006/07/25/59972.html</link><dc:creator>zhaofei1394</dc:creator><author>zhaofei1394</author><pubDate>Tue, 25 Jul 2006 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/Jody/archive/2006/07/25/59972.html</guid><wfw:comment>http://www.blogjava.net/Jody/comments/59972.html</wfw:comment><comments>http://www.blogjava.net/Jody/archive/2006/07/25/59972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jody/comments/commentRss/59972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jody/services/trackbacks/59972.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td width="8">
								</td>
								<td class="content_td">
										<font id="zoom">
												<p>1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<br />&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt; 可用于Table </p>
												<p>2. &lt;body onselectstart="return false"&gt; 取消选取、防止复制<br /><br />3. onpaste="return false" 不准粘贴</p>
												<p>4. oncopy="return false;" oncut="return false;" 防止复制</p>
												<p>5. &lt;link rel="Shortcut Icon" href="favicon.ico"&gt; IE地址栏前换成自己的图标</p>
												<p>6. &lt;link rel="Bookmark" href="favicon.ico"&gt; 可以在收藏夹中显示出你的图标</p>
												<p>7. &lt;input style="ime-mode:disabled"&gt; 关闭输入法</p>
												<p>8. 永远都会带着框架<br />&lt;script language="JavaScript"&gt;&lt;!--<br />if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页<br />// --&gt;&lt;/script&gt;</p>
												<p>9. 防止被人frame<br />&lt;SCRIPT LANGUAGE=JAVASCRIPT&gt;&lt;!-- <br />if (top.location != self.location)top.location=self.location;<br />// --&gt;&lt;/SCRIPT&gt;</p>
												<p>10. 网页将不能被另存为<br />&lt;noscript&gt;&lt;iframe src=*.html&gt;&lt;/iframe&gt;&lt;/noscript&gt; </p>
												<p>11. &lt;input type=button value=查看网页源代码 <br />onclick="window.location = "view-source:"+ "<a href="http://www.pconline.com.cn/">http://www.pconline.com.cn</a>""&gt;</p>
												<p>12.删除时确认<br />&lt;a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&amp;areyou=删除&amp;page=1""&gt;删除&lt;/a&gt; </p>
												<p>13. 取得控件的绝对位置<br />//Javascript<br />&lt;script language="Javascript"&gt;<br />function getIE(e){<br />var t=e.offsetTop;<br />var l=e.offsetLeft;<br />while(e=e.offsetParent){<br />t+=e.offsetTop;<br />l+=e.offsetLeft;<br />}<br />alert("top="+t+"/nleft="+l);<br />}<br />&lt;/script&gt;</p>
												<p>//VBScript<br />&lt;script language="VBScript"&gt;&lt;!--<br />function getIE()<br />dim t,l,a,b<br />set a=document.all.img1<br />t=document.all.img1.offsetTop<br />l=document.all.img1.offsetLeft<br />while a.tagName&lt;&gt;"BODY"<br />set a = a.offsetParent<br />t=t+a.offsetTop<br />l=l+a.offsetLeft<br />wend<br />msgbox "top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置"<br />end function<br />--&gt;&lt;/script&gt;</p>
												<p>14. 光标是停在文本框文字的最后<br />&lt;script language="javascript"&gt;<br />function cc()<br />{<br />var e = event.srcElement;<br />var r =e.createTextRange();<br />r.moveStart("character",e.value.length);<br />r.collapse(true);<br />r.select();<br />}<br />&lt;/script&gt;<br />&lt;input type=text name=text1 value="123" onfocus="cc()"&gt;</p>
												<p>15. 判断上一页的来源<br />javascript:<br />document.referrer</p>
												<p>16. 最小化、最大化、关闭窗口<br />&lt;object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Minimize"&gt;&lt;/object&gt;<br />&lt;object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Maximize"&gt;&lt;/object&gt;<br />&lt;OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;PARAM NAME="Command" VALUE="Close"&gt;&lt;/OBJECT&gt;<br />&lt;input type=button value=最小化 onclick=hh1.Click()&gt;<br />&lt;input type=button value=最大化 onclick=hh2.Click()&gt;<br />&lt;input type=button value=关闭 onclick=hh3.Click()&gt;<br />本例适用于IE</p>
												<p>17.屏蔽功能键Shift,Alt,Ctrl<br />&lt;script&gt;<br />function look(){ <br />if(event.shiftKey) <br />alert("禁止按Shift键!"); //可以换成ALT　CTRL<br />} <br />document.onkeydown=look; <br />&lt;/script&gt;</p>
												<p>18. 网页不会被缓存<br />&lt;META HTTP-EQUIV="pragma" CONTENT="no-cache"&gt;<br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"&gt;<br />&lt;META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"&gt;<br />或者&lt;META HTTP-EQUIV="expires" CONTENT="0"&gt;</p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td width="8">
								</td>
								<td class="content_td">
										<font id="zoom">
												<p>19.怎样让表单没有凹凸感？<br />&lt;input type=text style="border:1 solid #000000"&gt; <br />或<br />&lt;input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: <br />1 solid #000000"&gt;&lt;/textarea&gt;</p>
												<p>20.&lt;div&gt;&lt;span&gt;&amp;&lt;layer&gt;的区别？ <br />&lt;div&gt;(division)用来定义大段的页面元素，会产生转行 <br />&lt;span&gt;用来定义同一行内的元素，跟&lt;div&gt;的唯一区别是不产生转行 <br />&lt;layer&gt;是ns的标记，ie不支持，相当于&lt;div&gt;</p>
												<p>21.让弹出窗口总是在最上面:<br />&lt;body onblur="this.focus();"&gt;</p>
												<p>22.不要滚动条? <br />让竖条没有: <br />&lt;body style="overflow:scroll;overflow-y:hidden"&gt; <br />&lt;/body&gt; <br />让横条没有: <br />&lt;body style="overflow:scroll;overflow-x:hidden"&gt; <br />&lt;/body&gt; <br />两个都去掉？更简单了 <br />&lt;body scroll="no"&gt; <br />&lt;/body&gt; </p>
												<p>23.怎样去掉图片链接点击后，图片周围的虚线？<br />&lt;a href="#" onFocus="this.blur()"&gt;&lt;img src="logo.jpg" border=0&gt;&lt;/a&gt;</p>
												<p>24.电子邮件处理提交表单<br />&lt;form name="form1" method="post" action="<a href="mailto:****@***.com"><font color="#002c99">mailto:****@***.com</font></a>" enctype="text/plain"&gt; <br />&lt;input type=submit&gt;<br />&lt;/form&gt;</p>
												<p>25.在打开的子窗口刷新父窗口的代码里如何写？<br />window.opener.location.reload()</p>
												<p>26.如何设定打开页面的大小<br />&lt;body onload="top.resizeTo(300,200);"&gt;<br />打开页面的位置&lt;body onload="top.moveBy(300,200);"&gt;</p>
												<p>27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 <br />&lt;STYLE&gt; <br />body <br />{background-image:url(logo.gif); background-repeat:no-repeat; <br />background-position:center;background-attachment: fixed} <br />&lt;/STYLE&gt; </p>
												<p>28. 检查一段字符串是否全由数字组成<br />&lt;script language="Javascript"&gt;&lt;!--<br />function checkNum(str){return str.match(//D/)==null}<br />alert(checkNum("1232142141"))<br />alert(checkNum("123214214a1"))<br />// --&gt;&lt;/script&gt;</p>
												<p>29. 获得一个窗口的大小<br />document.body.clientWidth; document.body.clientHeight</p>
												<p>30. 怎么判断是否是字符<br />if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");<br />else alert("全是字符");</p>
												<p>31.TEXTAREA自适应文字行数的多少<br />&lt;textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"&gt;<br />&lt;/textarea&gt;</p>
												<p>32. 日期减去天数等于第二个日期<br />&lt;script language=Javascript&gt;<br />function cc(dd,dadd)<br />{<br />//可以加上错误处理<br />var a = new Date(dd)<br />a = a.valueOf()<br />a = a - dadd * 24 * 60 * 60 * 1000<br />a = new Date(a)<br />alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")<br />}<br />cc("12/23/2002",2)<br />&lt;/script&gt;</p>
												<p>33. 选择了哪一个Radio<br />&lt;HTML&gt;&lt;script language="vbscript"&gt;<br />function checkme()<br />for each ob in radio1<br />if ob.checked then window.alert ob.value<br />next<br />end function<br />&lt;/script&gt;&lt;BODY&gt;<br />&lt;INPUT name="radio1" type="radio" value="style" checked&gt;Style<br />&lt;INPUT name="radio1" type="radio" value="barcode"&gt;Barcode<br />&lt;INPUT type="button" value="check" onclick="checkme()"&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;</p>
												<p>34.脚本永不出错<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt; <br />&lt;!-- Hide <br />function killErrors() { <br />return true; <br />} <br />window.onerror = killErrors; <br />// --&gt; <br />&lt;/SCRIPT&gt;</p>
												<p>35.ENTER键可以让光标移到下一个输入框<br />&lt;input onkeydown="if(event.keyCode==13)event.keyCode=9"&gt;</p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td width="8">
								</td>
								<td class="content_td">
										<font id="zoom">
												<p>36. 检测某个网站的链接速度：<br />把如下代码加入&lt;body&gt;区域中:<br />&lt;script language=Javascript&gt;<br />tim=1<br />setInterval("tim++",100)<br />b=1<br />var autourl=new Array()<br />autourl[1]="<a href="http://www.njcatv.net/"><font color="#002c99">www.njcatv.net</font></a>"<br />autourl[2]="javacool.3322.net"<br />autourl[3]="<a href="http://www.sina.com.cn/"><font color="#002c99">www.sina.com.cn</font></a>"<br />autourl[4]="<a href="http://www.nuaa.edu.cn/"><font color="#002c99">www.nuaa.edu.cn</font></a>"<br />autourl[5]="<a href="http://www.cctv.com/"><font color="#002c99">www.cctv.com</font></a>"<br />function butt(){<br />document.write("&lt;form name=autof&gt;")<br />for(var i=1;i&lt;autourl.length;i++)<br />document.write("&lt;input type=text name=txt"+i+" size=10 value=测试中……&gt; =》&lt;input type=text <br />name=url"+i+" size=40&gt; =》&lt;input type=button value=GO </p>
												<p>onclick=window.open(this.form.url"+i+".value)&gt;&lt;br&gt;")<br />document.write("&lt;input type=submit value=刷新&gt;&lt;/form&gt;")<br />}<br />butt()<br />function auto(url){<br />document.forms[0]["url"+b].value=url<br />if(tim&gt;200)<br />{document.forms[0]["txt"+b].value="链接超时"}<br />else<br />{document.forms[0]["txt"+b].value="<a style="TEXT-DECORATION: underline" href="http://www.sogou.com/sogoupedia?query=时间" target="_blank"><font color="#002c99">时间</font></a>"+tim/10+"秒"}<br />b++<br />}<br />function run(){for(var i=1;i&lt;autourl.length;i++)document.write("&lt;img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 </p>
												<p>onerror=auto("<a href="http://&quot;+autourl/"><font color="#002c99">http://"+autourl</font></a>+"")&gt;")}<br />run()&lt;/script&gt;</p>
												<p>37. 各种样式的光标<br />auto ：标准光标<br />default ：标准箭头<br />hand ：手形光标<br />wait ：等待光标<br />text ：I形光标<br />vertical-text ：水平I形光标<br />no-drop ：不可拖动光标<br />not-allowed ：无效光标<br />help ：?帮助光标<br />all-scroll ：三角方向标<br />move ：移动标<br />crosshair ：十字标<br />e-resize<br />n-resize<br />nw-resize<br />w-resize<br />s-resize<br />se-resize<br />sw-resize</p>
												<p>38.页面进入和退出的特效<br />进入页面&lt;meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"&gt;<br />推出页面&lt;meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"&gt; <br />这个是页面被载入和调出时的一些特效。duration表示特效的持续时间，以秒为单位。transition表示使用哪种特效，取值为1-23:<br />　　0 矩形缩小 <br />　　1 矩形扩大 <br />　　2 圆形缩小<br />　　3 圆形扩大 <br />　　4 下到上刷新 <br />　　5 上到下刷新<br />　　6 左到右刷新 <br />　　7 右到左刷新 <br />　　8 竖百叶窗<br />　　9 横百叶窗 <br />　　10 错位横百叶窗 <br />　　11 错位竖百叶窗<br />　　12 点扩散 <br />　　13 左右到中间刷新 <br />　　14 中间到左右刷新<br />　　15 中间到上下<br />　　16 上下到中间 <br />　　17 右下到左上<br />　　18 右上到左下 <br />　　19 左上到右下 <br />　　20 左下到右上<br />　　21 横条 <br />　　22 竖条 <br />　　23 以上22种随机选择一种<br /><br />39.在规定时间内跳转<br />&lt;META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"&gt; </p>
												<p>40.网页是否被检索<br />&lt;meta name="ROBOTS" content="属性值"&gt;<br />　　其中属性值有以下一些:<br />　　属性值为"all": 文件将被检索，且页上链接可被查询；<br />　　属性值为"none": 文件不被检索，而且不查询页上的链接；<br />　　属性值为"index": 文件将被检索；<br />　　属性值为"follow": 查询页上的链接；<br />　　属性值为"noindex": 文件不检索，但可被查询链接；<br />　　属性值为"nofollow": 文件不被检索，但可查询页上的链接。</p>
										</font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/Jody/aggbug/59972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jody/" target="_blank">zhaofei1394</a> 2006-07-25 12:53 <a href="http://www.blogjava.net/Jody/archive/2006/07/25/59972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP和JavaScirpt数据交互</title><link>http://www.blogjava.net/Jody/archive/2006/07/13/58003.html</link><dc:creator>zhaofei1394</dc:creator><author>zhaofei1394</author><pubDate>Thu, 13 Jul 2006 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/Jody/archive/2006/07/13/58003.html</guid><wfw:comment>http://www.blogjava.net/Jody/comments/58003.html</wfw:comment><comments>http://www.blogjava.net/Jody/archive/2006/07/13/58003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jody/comments/commentRss/58003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jody/services/trackbacks/58003.html</trackback:ping><description><![CDATA[
		<font face="宋体">对于WEB程序来说，前端（JavaScript）和后端（JSP/Servlet）是没法共用数据的，只能是后端程序（JSP）把数据输出，生成页面到前端，这时候生成的页面中的JavaScript代码才有可能得到所谓jsp的数据。同样的，只有把JavaScript里的数据提交给后端JSP代码，JSP程序中才能得到JavaScript的数据。 <br /><br />    那如何实现在页面的JavaScript中使用jsp中的数据或是在jsp中使用页面的JavaScript数据呢？ <br /><br />一、页面中的JavaScript的数据如何提交给后台的jsp程序 <br />    ① 可以将JavaScript的数据以xxx.JSP?var1=aaa&amp;var2=bbb的形式作为URL的参数传给JSP程序，此时在jsp中用 <br />&lt;%String strVar1=request.getParameter("var1");%&gt;就可以获取到JavaScript脚本传递过来的数据； <br /><br />    ② 使用JavaScript通过在表单里加入隐藏域信息，然后用表单提交的方式把数据传递给JSP程序。 <br /><br /><br />  <br />  <br /><br />二、页面中的JavaScript的数据如何使用后台的JSP程序的数据 <br />    这个比较简单，直接在JavaScript脚本中用&lt;%＝strVar1%&gt;就可以把jsp程序中的数据传递给JavaScript脚本使用了。 <br /><br />三、参考下面例子： <br /><br />1、test.jsp <br /><br />&lt;%@ page contentType="text/html; charset=gb2312" %&gt; <br /><br />&lt;% <br />  String s1="Hello "; <br />  String s2="World!!"; <br />%&gt; <br /><br />&lt;script language="JavaScript"&gt; <br />&lt;!-- <br />/*************************************************************** <br />* JavaScript脚本，放置在页面中的任何位置都可以 <br />* insertclick()函数获取JSP传递到页面中的变量s1， <br />* 然后就可以在JavaScript中修改这个变量的值，再通过 <br />* post的方式提交给JSP程序来使用。 <br />***************************************************************/ <br />function insertclick(){ <br />  var1 ="&lt;%=s1 %&gt;"; <br />  document.forms["insertForm"].mc.value = var1 + document.forms["insertForm"].mc.value ; <br />  document.insertForm.submit(); <br />} <br />//--&gt; <br />&lt;/script&gt; <br /><br />&lt;!-- html页面form表单，放置在html页面中的位置不限 --&gt; <br />&lt;form name="insertForm" method="post" action="get.jsp"&gt; <br />&lt;!-- 下面这一句是获取JSP程序中传递过来的变量值 --&gt; <br />&lt;input type="hidden" name="mc" value="&lt;%=s2 %&gt;"&gt; <br />&lt;input type="button" value="提交" onclick="insertclick()"&gt; <br />&lt;/form&gt; <br /><br />2、get.jsp <br /><br />&lt;% <br />  String strVar1=request.getParameter("mc"); <br />  out.print(strVar1); <br />%&gt; </font>
		<br />
<img src ="http://www.blogjava.net/Jody/aggbug/58003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jody/" target="_blank">zhaofei1394</a> 2006-07-13 16:17 <a href="http://www.blogjava.net/Jody/archive/2006/07/13/58003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的“异常”</title><link>http://www.blogjava.net/Jody/archive/2006/04/20/42190.html</link><dc:creator>zhaofei1394</dc:creator><author>zhaofei1394</author><pubDate>Thu, 20 Apr 2006 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/Jody/archive/2006/04/20/42190.html</guid><wfw:comment>http://www.blogjava.net/Jody/comments/42190.html</wfw:comment><comments>http://www.blogjava.net/Jody/archive/2006/04/20/42190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jody/comments/commentRss/42190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jody/services/trackbacks/42190.html</trackback:ping><description><![CDATA[
		<p align="center">
				<big>
						<strong>
								<font size="3">Java的“异常”</font>
						</strong>
				</big>
		</p>
		<div align="right">                     </div>
		<p>“ 异 常” 指 的 是 程 序 运 行 时 出 现 的 非 正 常 情 况。 在 用 传统 的 语 言 编 程 时， 程 序 员 只 能 通 过 函 数 的 返 回 值 来 发 出错 误 信 息。 这 易 于 导 致 很 多 错 误， 因 为 在 很 多 情 况 下 需 要知 道 错 误 产 生 的 内 部 细 节。 通 常， 用 全 局 变 量errno来 存 储“ 异 常” 的 类 型。 这 容 易 导 致 误 用， 因 为 一 个errno的 值 有 可 能在 被 处 理 ?reg; 前 被 另 外 的 错 误 覆 盖 掉。 即 使 最 优 美 的C语言 程 序， 为 了 处 理“ 异 常” 情 况， 也 常 求 助 于goto语 句。 Java对“ 异 常” 的 处 理 是 面 向 对 象 的。 一 个Java的Exception是 一 个 描 述“ 异 常” 情 况 的 对 象。 当 出 现“ 异 常” 情 况 时， 一 个Exception对象 就 产 生 了， 并 放 到 产 生 这 个“ 异 常” 的 成 员 函 数 里。 </p>
		<h4 align="center">8.1 基础 </h4>
		<p>Java的“ 异 常” 处 理 是 通 过5个 关 键 词 来 实 现 的：try, catch, throw, throws和finally。 用try 来 执 行 一 段 程 序， 如 果 出 现“ 异常”， 系 统 抛 出（throws?copy; 一 个“ 异 常”， 你 可 以 通 过 它 的类 型 来 捕 捉（catch?copy; 它， 或 最 后（finally?copy; 由 缺 省 处理 器 来 处 理。 下 面 是“ 异 常” 处 理 程 序 的 基 本 形 式： </p>
		<p>try { //程 序 块 } catch (ExceptionType1 e) { // 对ExceptionType1的处 理 } catch (ExceptionType2 e) { // 对ExceptionType2的 处 理 throw(e); //再 抛 出 这 个“ 异 常” } finally { } </p>
		<h4 align="center">8.2 "异 常” 的 类 型</h4>
		<p>在“ 异 常” 类 层 次 的 最 上 层 有 一 个 单 独 的 类 叫 做Throwable。这 个 类 用 来 表 示 所 有 的“ 异 常” 情 况。 每 个“ 异 常” 类 型 都是Throwable的 子 类。Throwable有 两 个 直 接 的 子 类。 一 类 是Exception，是 用 户 程 序 能 够 捕 捉 到 的“ 异 常” 情 况。 我 们 将 通 过 产 生它 的 子 类 来 创 建 自 己 的“ 异 常”。 另 一 类 是Error， 它 定 义 了那 ?copy; 通 常 无 法 捕 捉 到 的“ 异 常”。 要 谨 慎 使 用Error子 类，因 为 它 们 通 常 会 导 致 灾 难 性 的 失 败。 在Exception中 有 一 个 子类RuntimeException， 它 是 程 序 运 行 时 自 动 地 对 某 ?copy; 错 误作 出 反 应 而 产 生 的。 </p>
		<h4 align="center">8.3 不 捕 捉“ 异 常” </h4>
		<p>“ 异 常” 对 象 是Java在 运 行 时 对 某 ?copy;“ 异 常” 情 况 作出 反 应 而 产 生 的。 例 如， 下 面 这 个 小 程 序 包 含 一 个 整 数 被0除的“ 异 常”。 </p>
		<p>class Exc0 { public static void main(String args[]) { int d = 0; int a = 42/d; } } </p>
		<p>当Java执 行 这 个 除 法 时， 由 于 分 母 是0， 就 会 构 造 一 个“ 异常” 对 象 来 使 程 序 停 下 来 并 处 理 这 个 错 误 情 况， 在 运 行 时“ 抛 出”（throw?copy; 这 个“ 异 常”。 说“ 抛 出” 是 因 为 它 象 一个 滚 烫 的 马 铃 薯， 你 必 须 把 它 抓 住 并 立 即 处 理。 程 序 流 将会 在 除 号 操 作 符 处 被 打 断， 然 后 检 查 当 前 的 调 用 堆 栈 来查 找“ 异 常”。 一 个“ 异 常” 处 理 器 是 用 来 立 即 处 理“ 异 常” 情 况 的。 在 这 个 例 子 里， 我 们 没 有 编 一 个“ 异 常” 处 理 器，所 以 缺 省 的 处 理 器 就 发 挥 作 用 了。 缺 省 的 处 理 器 打 印Exception的字 符 ?reg; 值 和 发 生 “ 异 常” 的 地 点。 下 面 是 我 们 的 小 例子 的 输 出。 </p>
		<p>C:\&gt;java Exc0 java.lang.arithmeticException: / by zero at Exc0.main(Exc0.java:4) </p>
		<h4 align="center">8.4 try与catch </h4>
		<p>通 常 我 们 希 望 自 己 来 处 理“ 异 常” 并 继 续 运 行。 可 以 用try来指 定 一 块 预 防 所 有“ 异 常” 的 的 程 序。 紧 跟 在try程 序 后 面，应 包 含 一 个catch子 句 来 指 定 你 想 要 捕 捉 的“ 异 常” 的 类 型。例 如， 下 面 的 例 子 是 在 前 面 的 例 子 的 基础上 构 造 的， 但 它包 含 一 个try程 序 块 和 一 个catch子 句。 </p>
		<p>class exc1 { public static void main(string args[]) { try { int d = 0; int a = 42 / d; } catch (arithmeticexception e) { system.out.println("division by zero"); } } } </p>
		<p>catch子 句 的 目 标 是 解 决“ 异 常” 情 况， 把 一 ?copy; 变 量 设到 合 理 的 状 态， 并 象 没 有 出 错 一 样 继 续 运 行。 如 果 一 个 子程 序 不 处 理 某 个“ 异 常”， 则 返 到 上 一 级 处 理， 直 到 最 外一 级。 </p>
		<h4 align="center">8.5 多 个catch子 句</h4>
		<p>在 某 ?copy; 情 况 下， 同 一 段 程 序 可 能 产 生 不 止 一 种“ 异常” 情 况。 你 可 以 放 置 多 个catch子 句， 其 中 每 一 种“ 异 常” 类 型 都 将 被 检 查， 第 一 个 与 ?reg; 匹 配 的 就 会 被 执 行。 如果 一 个 类 和 其 子 类 都 有 的 话， 应 把 子 类 放 在 前 面， 否 则 将永 远 不 会 到 达 子 类。 下 面 是 一 个 有 两 个catch子 句 的 程 序 的例 子。 </p>
		<p>class MultiCatch { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42/a; int c[] = {1}; c[42] = 99; } catch(ArithmeticException e) { System.out.println("div by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { system.out.println("array index oob: " + e); } } } </p>
		<p>如 果 在 程 序 运 行 时 不 跟 参 数， 将 会 引 起 一 个0做 除 数 的“ 异 常”， 因 为a的 值 为0。 如 果 我 们 提 ?copy; 一 个 命 令 行 参 数，将 不 会 产 生 这 个“ 异 常”， 因 为a的 值 大 于0。 但 会 引 起 一 个 ArrayIndexOutOfBoundexception的“ 异 常”， 因 为 整 型 数 组c的 长 度是1， 却 给c[42]赋 值。 下 面 是 以 上 两 种 情 况 的 运 行 结 果。 </p>
		<p>C:\&gt;java MultiCatch a = 0 div by 0: java.lang.arithmeticexception: / by zero C:\&gt;java MutiCatch 1 a = 1 array index oob: java.lang.ArrayIndexOutOfBoundsException:42 </p>
		<h4 align="center">8.6 try语 句 的 嵌 套 </h4>
		<p>你 可 以 在 一 个 成 员 函 数 调 用 的 外 面 写 一 个try语 句， 在 这个 成 员 函 数 内 部， 写 另 一 个try语 句 保 护 其 他 代 码。 每 当 遇到 一 个try语 句，“ 异 常” 的 框 架 就 放 到 堆 栈 上 面， 直 到 所 有的try语 句 都 完 成。 如 果 下 一 级 的try语 句 没 有 对 某 种“ 异 常” 进 行 处 理， 堆 栈 就 会 展 开， 直 到 遇 到 有 处 理 这 种“ 异 常” 的try语 句。 下 面 是 一 个try语 句 嵌 套 的 例 子。 </p>
		<p>class MultiNest { static void procedure() { try { int c[] = { 1 }: c[42] = 99; } catch(ArrayIndexOutOfBoundsexception e) { System.out.println("array index oob: " + e); } } public static void main(String args[]) { try { int a = args.length; system.out.println("a = " + a); int b = 42/a; procedure(); } catch(arithmeticException e) { System.out.println("div by 0: " + e); } } } </p>
		<p>成 员 函 数procedure里 有 自 己 的try/catch控 制， 所 以main不 用 去处 理 ArrayIndexOutOfBoundsException。 </p>
		<h4 align="center">8.7 throw语 句</h4>
		<p>throw语 句 用 来 明 确 地 抛 出 一 个“ 异 常”。 首 先， 你 必 须 得到 一 个Throwable的 实 例 的 控 制 柄， 通 过 参 数 传 到catch子 句， 或者 用new操 作 符 来 创 建 一 个。 下 面 是throw语 句 的 通 常 形 式。 </p>
		<p>throw ThrowableInstance; </p>
		<p>程 序 会 在throw语 句 后 立 即 终 止， 它 后 面 的 语 句 执 行 不 到，然 后 在 包 含 它 的 所 有try块 中 从 里 向 外 寻 找 含 有 与 其 匹 配的catch子 句 的try块。 下 面 是 一 个 含 有throw语 句 的 例 子。 </p>
		<p>class ThrowDemo { static void demoproc() { try { throw new NullPointerException("de3mo"); } catch(NullPointerException e) { System.out.println("caught inside demoproc"); throw e; } } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { system.out.println("recaught: " + e); } } } </p>
		<h4 align="center">8.8 throws语 句 </h4>
		<p>throws用 来 标 明 一 个 成 员 函 数 可 能 抛 出 的 各 种“ 异 常”。对 大 多 数Exception子 类 来 说，Java 编 译 器 会 强 迫 你 声 明 在 一个 成 员 函 数 中 抛 出 的“ 异 常” 的 类 型。 如 果“ 异 常” 的 类 型是Error或 RuntimeException， 或 它 们 的 子 类， 这 个 规 则 不 起 作 用，因 为 这 ?copy; 在 程 序 的 正 常 部 分 中 是 不 期 待 出 现 的。 如 果你 想 明 确 地 抛 出 一 个RuntimeException， 你 必 须 用throws语 句 来声 明 它 的 类 型。 这 就 重 新 定 义 了 成 员 函 数 的 定 义 语 法： </p>
		<p>type method-name(arg-list) throws exception-list { } </p>
		<p>下 面 是 一 段 程 序， 它 抛 出 了 一 个“ 异 常”， 但 既 没 有 捕捉 它， 也 没 有 用throws来 声 明。 这 在 编 译 时 将 不 会 通 过。 </p>
		<p>class ThrowsDemo1 { static void procedure( ) [ System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { procedure( ); } } </p>
		<p>为 了 让 这 个 例 子 编 译 过 去， 我 们 需 要 声 明 成 员 函 数procedure抛出 了IllegalAccessException， 并 且 在 调 用 它 的 成 员 函 数main里 捕捉 它。 下 面 是 正 确 的 例 子： </p>
		<p>class ThrowsDemo { static void procedure( ) throws IllegalAccessException { System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { procedure( ); } catch (IllegalAccessException e) { System.out.println("caught " + e); } } } </p>
		<p>下 面 是 输 出 结 果： </p>
		<p>C:\&gt;java ThrowsDemo inside procedure caught java.lang.IllegalAccessException: demo </p>
		<h4 align="center">8.9 finally </h4>
		<p>当 一 个“ 异 常” 被 抛 出 时， 程 序 的 执 行 就 不 再 是 线 性 的，跳 过 某 ?copy; 行， 甚 至 会 由 于 没 有 与 ?reg; 匹 配 的catch子 句而 过 早 地 返 回。 有 时 确 保 一 段 代 码 不 管 发 生 什 么“ 异 常” 都 被 执 行 到 是 必 要 的， 关 键 词finally就 是 用 来 标 识 这 样 一段 代 码 的。 即 使 你 没 有catch子 句，finally程 序 块 也 会 在 执 行 try程 序 块 后 的 程 序 ?reg; 前 执 行。 每 个try语 句 都 需 要 至 少一 个 与 ?reg; 相 配 的catch子 句 或finally子 句。 一 个 成 员 函 数 返回 到 调 用 它 的 成 员 函 数， 或 者 通 过 一 个 没 捕 捉 到 的“ 异 常”，或 者 通 过 一 个 明 确 的return语 句，finally子 句 总 是 恰 好 在 成 员函 数 返 回 前 执 行。 下 面 是 一 个 例 子， 它 有 几 个 成 员 函 数，每 个 成 员 函 数 用 不 同 的 途 径 退 出， 但 执 行 了finally子 句。 </p>
		<p>class FinallyDemo { static void procA( ) { try { System.out.println("inside procA"); throw new RuntimeException("demo"); } finally { System.out.println("procA's finally"); } } static void procB( ) { try { System.out.println("inside procB"); return; } finally { System.out.println("procB's finally"); } } public static void main(String args[]) { try { procA( ); } catch (Exception e); procB( ); } } </p>
		<p>下 面 是 这 个 例 子 的 运 行 结 果： </p>
		<p>C:\&gt;java FinallyDemo inside procA procA's finally inside procB procB's finally </p>
		<h4 align="center">本 章 小 结 </h4>
		<p>1. “ 异 常” 指 的 是 程 序 运 行 时 出 现 的 非 正 常 情 况。 2. 在“ 异 常” 类 ?次 的 最 上 层 的 类 叫Throwable， 它 有 两 个 直 接 的 子类：Exception和Error。 3. Java的“ 异 常” 处 理 通 过5个 关 键 词 来 实现：try，catch，throw，throws和finally。 </p>
<img src ="http://www.blogjava.net/Jody/aggbug/42190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jody/" target="_blank">zhaofei1394</a> 2006-04-20 16:41 <a href="http://www.blogjava.net/Jody/archive/2006/04/20/42190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java日期格式转换测试</title><link>http://www.blogjava.net/Jody/archive/2006/04/06/39617.html</link><dc:creator>zhaofei1394</dc:creator><author>zhaofei1394</author><pubDate>Thu, 06 Apr 2006 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/Jody/archive/2006/04/06/39617.html</guid><wfw:comment>http://www.blogjava.net/Jody/comments/39617.html</wfw:comment><comments>http://www.blogjava.net/Jody/archive/2006/04/06/39617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jody/comments/commentRss/39617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jody/services/trackbacks/39617.html</trackback:ping><description><![CDATA[
		<div align="center">
				<h1 class="aTitle">java日期格式转换测试</h1>
		</div>
		<table width="97%" align="center">
				<tbody>
						<tr>
								<td width="120">
								</td>
								<td align="middle">来源：<span id="SourceLabel"></span>  作者：<span id="AuthorLabel"></span></td>
								<td align="right" width="100">[字体：<a href="javascript:ContentSize(16)">大</a><a href="javascript:ContentSize(14)">中</a><a href="javascript:ContentSize(12)">小</a>] </td>
						</tr>
				</tbody>
		</table>
		<div class="content" id="BodyLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
				<p>
						<span class="hiddenIt">[更多内容请访问 http://www.heci.net 贺词网！]<br /></span>java日期格式转换测试<br /><br />用到的包<br />//import java.util.Locale;<!--DVNEWS_AD_BEGIN--></p>
				<table width="100%">
						<tbody>
								<tr>
										<td>支持一鸣，就点一下↓
<script type="text/javascript"><!--
google_ad_client = "pub-3429300811935132";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = ["A8DDA0","FF4500","333333","578A24"];
google_color_bg = ["EBFFED","FFEBCD","000000","CCFF99"];
google_color_link = ["0000CC","DE7008","FFFFFF","00008B"];
google_color_url = ["008000","E0AD12","999999","00008B"];
google_color_text = ["6F6F6F","8B4513","CCCCCC","000000"];
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3429300811935132&amp;dt=1144302762359&amp;lmt=1143863221&amp;format=300x250_as&amp;output=html&amp;url=http%3A%2F%2Fwww.cokecn.com%2Fhtml%2F2006-04%2F7193.html&amp;color_bg=CCFF99&amp;color_text=000000&amp;color_link=00008B&amp;color_url=00008B&amp;color_border=578A24&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3D%25C8%25D5%25C6%25DA%2B%25D7%25AA%25BB%25AF%25CE%25AA%2B%25D7%25D6%25B7%25FB%25B4%25AE%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3D%25C8%25D5%25C6%25DA%2B%25D7%25AA%25BB%25AF%25CE%25AA%2B%25D7%25D6%25B7%25FB%25B4%25AE%2Bjava%26ct%3D0&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="300" scrolling="no" height="250" allowtransparency=""></iframe></td>
										<td>
												<script type="text/javascript">
														<!--
google_ad_client = "pub-3429300811935132";
google_ad_width = 250;
google_ad_height = 250;
google_ad_format = "250x250_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = ["A8DDA0","FF4500","333333","578A24"];
google_color_bg = ["EBFFED","FFEBCD","000000","CCFF99"];
google_color_link = ["0000CC","DE7008","FFFFFF","00008B"];
google_color_url = ["008000","E0AD12","999999","00008B"];
google_color_text = ["6F6F6F","8B4513","CCCCCC","000000"];
//-->
												</script>
												<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
												</script>
												<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3429300811935132&amp;dt=1144302762375&amp;lmt=1143863221&amp;prev_fmts=300x250_as&amp;format=250x250_as&amp;output=html&amp;url=http%3A%2F%2Fwww.cokecn.com%2Fhtml%2F2006-04%2F7193.html&amp;color_bg=CCFF99&amp;color_text=000000&amp;color_link=00008B&amp;color_url=00008B&amp;color_border=578A24&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dgb2312%26bs%3D%25C8%25D5%25C6%25DA%2B%25D7%25AA%25BB%25AF%25CE%25AA%2B%25D7%25D6%25B7%25FB%25B4%25AE%26sr%3D%26z%3D%26cl%3D3%26f%3D8%26wd%3D%25C8%25D5%25C6%25DA%2B%25D7%25AA%25BB%25AF%25CE%25AA%2B%25D7%25D6%25B7%25FB%25B4%25AE%2Bjava%26ct%3D0&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="250" scrolling="no" height="250" allowtransparency="">
												</iframe>
										</td>
								</tr>
						</tbody>
				</table>
				<!--DVNEWS_AD_END-->
				<br />import java.text.*;<br />import java.util.*;<br /><br />1.-----------------------------------------<br />得到系统当前时间：<br /><br />java.util.Date dt=new java.util.Date();<br />System.out.print(dt);  //输出结果是：Wed Aug 10 11:29:11 CST 2005<br /><br />SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");<br />System.out.print(sdf.format(dt));  //输出结果是：2005-08-10<br /><br />2.-----------------------------------------<br />把字符串转化为java.util.Date<br />方法一：<br />SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");<br />java.util.Date dt=sdf.parse("2005-2-19");<br />System.out.print(sdf.format(dt));    //输出结果是：2005-2-19<br /><br />方法二：<br />java.util.Date dt=null;<br />DateFormat df=DateFormat.getDateInstance();<br />dt=df.parse("2005-12-19");<br />System.out.println(dt);              //输出结果为：Mon Dec 19 00:00:00 CST 2005<br />System.out.println(df.format(dt));  //输出结果为：2005-2-19<br /><br />3.-----------------------------------------<br />把字符串转化为java.sql.Date<br />字符串必须是"yyyy-mm-dd"格式，否则会抛出IllegalArgumentException异常<br />java.sql.Date sdt=java.sql.Date.valueOf("2005-9-6");<br />System.out.println(sdt);          //输出结果为：2005-9-6<br /><br />4.-----------------------------------------<br />TestApp.java<br /><br />public class TestApp {<br /><br />    public static void main(String[] args) {<br />        System.out.println("Hello World!");<br />        Date d=new Date();<br />        <br />        //System.out.println(d.toLocaleString());<br />        <br />        //Calendar cld=Calendar.getInstance();<br />        System.out.println("Calendar.get(Calendar.DATE)"+(Calendar.getInstance().get(Calendar.DATE)));<br />        <br />        Date dt=new Date();//Date(103,-5,-6);<br />        System.out.println("getNowYear(Date dt)"+getYear(dt));<br />        System.out.println("getNowMonth(Date dt)"+getMonth(dt));<br />        System.out.println("getNowDate(Date dt)"+getDate(dt));<br />    }<br />    <br /><br />    /**<br />    * 获得当前日期的年份。<br />    * @return int 年份<br />    */<br />    public static int getNowYear(){<br />        return Calendar.getInstance().get(Calendar.YEAR);<br />    }<br /><br />    /**<br />    * 获得给定日期的年份<br />    * @param dt 给定日期<br />    * @return int 年份<br />    * @throws NullPointerException 如果参数年份为null，抛出异常。<br />    */<br />    public static int getYear(Date dt)throws NullPointerException{<br />        if(dt==null){<br />            throw new NullPointerException("日期参数为null");<br />        }else{<br />            Calendar cld=Calendar.getInstance();<br />            cld.setTime(dt);<br />            return cld.get(Calendar.YEAR);<br />        }<br />    }<br />    <br />    /**<br />    * 获得当前日期的月份。<br />    * @return int 月份<br />    */<br />    public static int getNowMonth(){<br />        return 1+Calendar.getInstance().get(Calendar.MONTH);<br />    }<br />    <br />    /**<br />    * 获得给定日期的月份<br />    * @param dt 给定日期<br />    * @return int 月份（1-12）<br />    * @throws NullPointerException 如果参数年份为null，抛出异常。<br />    */<br />    public static int getMonth(Date dt)throws NullPointerException{<br />        if(dt==null){<br />            throw new NullPointerException("日期参数为null");<br />        }else{<br />            Calendar cld=Calendar.getInstance();<br />            cld.setTime(dt);<br />            return 1+cld.get(Calendar.MONTH);<br />        }<br />    }<br />    /**<br />    * 获得当前日期的当月的天数。<br />    * @return int 当月的天数<br />    */<br />    public static int getNowDate(){<br />        return 1+Calendar.getInstance().get(Calendar.DATE);<br />    }<br />    <br />    /**<br />    * 获得给定日期的当月的天数<br />    * @param dt 给定日期<br />    * @return int 当月的天数<br />    * @throws NullPointerException 如果参数年份为null，抛出异常。<br />    */<br />    public static int getDate(Date dt)throws NullPointerException{<br />        if(dt==null){<br />            throw new NullPointerException("日期参数为null");<br />        }else{<br />            Calendar cld=Calendar.getInstance();<br />            cld.setTime(dt);<br />            return cld.get(Calendar.DATE);<br />        }<br />    }<br />}<br /></div>
<img src ="http://www.blogjava.net/Jody/aggbug/39617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jody/" target="_blank">zhaofei1394</a> 2006-04-06 16:39 <a href="http://www.blogjava.net/Jody/archive/2006/04/06/39617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>