??xml version="1.0" encoding="utf-8" standalone="yes"?>
Jsp面在URL中传递参C出现q 解决Ҏ如下Q?/font> 一、用更改Tomcat的方法?/strong>q个Ҏ单,但是需要改动的地方是服务器软gU别的,如果E微变动pȝ无法正{码,UL性不高?/font> 1、来到tomcat目录Q找到conf目录下的server.xml问hQ打开Q找?lt;Connector>标签Q在最后添加URIEncoding=’GBK’Q效果如下: view plaincopy to clipboardprint? <Connector port="8080"maxThreads="150"minSpareThreads="25"maxSpareThreads="75" enableLookups="false"redirectPort="8443"acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true"URIEncoding=″GBK″/> <Connectorport="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" acceptCount="100"debug="0" connectionTimeout="20000"disableUploadTimeout="true" URIEncoding=″GBK″/> q种Ҏ对getq个Ҏ试成功?/font> 2、在每个Jsp面d如下代码 view plaincopy to clipboardprint? <%@pagepageEncoding=”gb2312″%> <%@pagecontentType=”text/html;charset=gb2312″%> <%request.setCharacterEncoding(”gb2312″);%> <%@ page pageEncoding=”gb2312″%><%@ page contentType=”text/html;charset=gb2312″%><%request.setCharacterEncoding(”gb2312″);%> ~码方式也可以改成GBKQ支持繁体中文。重启TomcatQ这一步很重要Q否则可能看不到效果?/font> q种Ҏ对post试成功。徏议两U同步用?/font> 二、用JSP的scriptLet view plaincopy to clipboardprint? <%=newString(elValue.getBytes("iso-8859-1"),"GBK")%> <%=new String(elValue.getBytes("iso-8859-1"),"GBK")%> 三、用自定义JSTL q是我们的重Ҏ?q里要详l说? W一,~写自定义标{?/font> W二~写tag文g W三部vtag文g W四使用?)很简单的. 5.2 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte.longQstring 都不能作用于swtich. 5.3 try {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后Q?/strong> 会执行,在return前执行?/p>
5.4 ~程题: 用最有效率的Ҏ出2乘以8{於几? 2 << 3 5.5 两个对象值相同(x.equalsQyQ?== trueQ,但却可有不同的hash codeQ这句话对不对? 不对Q有相同的hash code. 5.6 当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传递? 是g递?a target="_blank">Java ~程语言只有g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?/p>
5.7 当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方法? 不能Q一个对象的一个synchronizedҎ只能׃个线E访问?/p>
Q这个有点疑问:问的是这个对象的其他ҎQ而非synchonizedҎ。) 5.8 ~程题: 写一个Singleton出来?/strong> Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?/p>
一般Singleton模式通常有几U种形式Q?/p>
W一UŞ式: 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引用,l而调用其中的Ҏ?/p>
package test; public class Singleton { private Singleton() { } // 在自己内部定义自׃个实例,是不是很奇怪? // 注意q是private 只供内部调用 private static Singleton instance = new Singleton(); // q里提供了一个供外部讉K?/span>class的静态方法,可以直接讉K public static Singleton getInstance() { return instance; } }
]]>
参考资料:http://zhidao.baidu.com/question/1996221.html
]]>
W二UŞ式:
package test; public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { // q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一?/span> // 使用时生成实例,提高了效率! if (instance == null) instance = new Singleton(); return instance; } } |
其他形式Q?/p>
定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?/p>
一般认为第一UŞ式要更加安全?/p>
5.9 Java的接口和C++的虚cȝ相同和不同处?/strong>
׃Java不支持多l承Q而有可能某个cL对象要用分别在几个cL对象里面的方法或属性,现有的单l承机制׃能满求。与l承相比Q接口有更高的灵zL,因ؓ接口中没有Q何实C码。当一个类实现了接口以后,该类要实现接口里面所有的Ҏ和属性,q且接口里面的属性在默认状态下面都是public staticQ所有方法默认情况下是public.一个类可以实现多个接口?/p>
5.10 Java中的异常处理机制的简单原理和应用?/strong>
当JavaE序q反了Java的语义规则时QJava虚拟机就会将发生的错误表CZؓ一个异常。违反语义规则包?U情c一U是Javacd内置的语义检查。例如数l下标越界,会引发IndexOutOfBoundsExceptionQ访问null的对象时会引发NullPointerException.另一U情况就是Java允许E序员扩展这U语义检查,E序员可以创q异常Qƈ自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子cR?/p>
EntityBeanQEntity Beans能存zȝ对较长的旉Qƈ且状态是持箋的。只要数据库中的数据存在QEntity beans׃直存zR而不是按照应用程序或者服务进E来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或?Beans自己理?/p>
EJB通过以下技术管理事务:对象理l织QOMGQ的对象事务服务QOTSQ,Sun Microsystems的Transaction ServiceQJTSQ?a class="channel_keylink" target="_blank">Java Transaction APIQJTAQ,开发组QX/OpenQ的XA接口?/p>
4.2 应用服务?/a>有那些?
BEA WebLogic ServerQIBM WebSphere Application ServerQ?a class="channel_keylink" target="_blank">Oracle9i Application ServerQjBossQTomcat
4.3 l我一个你最常见到的runtime exception.
ArithmeticExceptionQ?ArrayStoreExceptionQ?BufferOverflowExceptionQ?BufferUnderflowExceptionQ?CannotRedoExceptionQ?CannotUndoExceptionQ?ClassCastExceptionQ?CMMExceptionQ?ConcurrentModificationExceptionQ?DOMExceptionQ?EmptyStackExceptionQ?IllegalArgumentExceptionQ?IllegalMonitorStateExceptionQ?IllegalPathStateExceptionQ?IllegalStateExceptionQ?ImagingOpExceptionQ?IndexOutOfBoundsExceptionQ?MissingResourceExceptionQ?NegativeArraySizeExceptionQ?NoSuchElementExceptionQ?NullPointerExceptionQ?ProfileDataExceptionQ?ProviderExceptionQ?RasterFormatExceptionQ?SecurityExceptionQ?SystemExceptionQ?UndeclaredThrowableExceptionQ?UnmodifiableSetExceptionQ?UnsupportedOperationException.
4.4 接口是否可承接口? 抽象cL否可实现QimplementsQ接口? 抽象cL否可l承实体c(concrete classQ?
接口可以l承接口。抽象类可以实现QimplementsQ接口,抽象cL否可l承实体c,但前提是实体cdL明确的构造函数?/p>
4.5 ListQ?SetQ?Map是否l承自Collection接口Q?/strong>
ListQSet是,Map不是
4.6 说出数据q接池的工作机制是什么?
J2EE服务器启动时会徏立一定数量的池连接,q一直维持不于此数目的池连接。客LE序需要连接时Q池驱动E序会返回一个未使用的池q接q将其表Cؓ忙。如果当前没有空闲连接,池驱动程序就新徏一定数量的q接Q新接的数量有配|参数决定。当使用的池q接调用完成后,池驱动程序将此连接表CؓI闲Q其他调用就可以使用q个q接?/p>
4.7 abstract的method是否可同时是staticQ是否可同时是nativeQ是否可同时是synchronizedQ?/strong>
都不?/p>
4.8 数组有没有lengthQ)q个ҎQ?String有没有lengthQ)q个ҎQ?/strong>
数组没有lengthQ)q个ҎQ有length的属性。String有有lengthQ)q个Ҏ?/p>
4.9 Set里的元素是不能重复的Q那么用什么方法来区分重复与否呢? 是用==q是equalsQ)Q?它们有何区别Q?/strong>
Set里的元素是不能重复的Q那么用iteratorQ)Ҏ来区分重复与否。equalsQ)是判M个Set是否相等?/p>
equalsQ)?=Ҏ军_引用值是否指向同一对象equalsQ)在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?/p>
4.10 构造器Constructor是否可被overrideQ?/strong>
构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading.
3.2 JSP中动态INCLUDE与静态INCLUDE的区别?
动态INCLUDE用jspQinclude动作实现 <jspQinclude page="included.jsp" flush="true" />它L会检查所含文件中的变化,适合用于包含动态页面,q且可以带参数?/p>
静态INCLUDE用include伪码实现Q定不会查所含文件的变化Q适用于包含静态页?lt;%@ include file="included.htm" %>
3.3 什么时候用assert.
assertionQ断aQ在软g开发中是一U常用的调试方式Q很多开发语a中都支持q种机制。在实现中,assertion是在程序中的一条语句,它对一个boolean表达式进行检查,一个正程序必M证这个boolean表达式的gؓtrueQ如果该gؓfalseQ说明程序已l处于不正确的状态下Q系l将l出警告或退出。一般来_assertion用于保证E序最基本、关键的正确性。assertion查通常在开发和试时开启。ؓ了提高性能Q在软g发布后,assertion查通常是关闭的?/p>
3.4 GC是什么? Z么要有GCQ?/strong>
GC是垃圾收集的意思(Gabage CollectionQ,内存处理是编Eh员容易出现问题的地方Q忘记或者错误的内存回收会导致程序或pȝ的不E_甚至崩溃Q?a target="_blank">Java提供的GC功能可以自动监测对象是否过作用域从而达到自动回收内存的目的Q?a target="_blank">Java语言没有提供释放已分配内存的昄操作Ҏ?/p>
3.5 short s1 = 1Q?s1 = s1 + 1Q有什么错Q?short s1 = 1Q?s1 += 1Q有什么错Q?/strong>
short s1 = 1Q?s1 = s1 + 1Q?Qs1+1q算l果是int型,需要强制{换类型)
short s1 = 1Q?s1 += 1Q(可以正确~译Q?/p>
3.6 Math.roundQ?1.5Q等於多? Math.roundQ?11.5Q等於多?
Math.roundQ?1.5Q?=12
Math.roundQ?11.5Q?=-11
roundҎq回与参数最接近的长整数Q参数加1/2后求其floor.
3.7 String s = new StringQ?xyz"Q;创徏了几个String ObjectQ?/strong>
两个
3.8 设计4个线E,其中两个U程每次对j增加1Q另外两个线E对j每次减少1.写出E序?/strong>
以下E序使用内部cd现线E,对j增减的时候没有考虑序问题?/p>
package test; public class ThreadTest1 { private int j; public static void main(String args[]) { ThreadTest1 tt = new ThreadTest1(); Inc inc = tt.new Inc(); Dec dec = tt.new Dec(); for (int i = 0; i < 2; i++) { Thread t = new Thread(inc); t.start(); t = new Thread(dec); t.start(); } } private synchronized void inc() { j++; System.out.println(Thread.currentThread().getName() + "-inc:" + j); } private synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "-dec:" + j); } class Inc implements Runnable { public void run() { for (int i = 0; i < 3; i++) { inc(); } } } class Dec implements Runnable { public void run() { for (int i = 0; i < 3; i++) { dec(); } } } } |
3.9 Java有没有gotoQ?/strong>
Java中的保留字,现在没有在Java中用?/p>
3.10 启动一个线E是用runQ)q是startQ)Q?/strong>
启动一个线E是调用startQ)ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。runQ)Ҏ可以产生必须退出的标志来停止一个线E?/p>
HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允许?/p>
HashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey.因ؓcontainsҎҎ让h引v误解?/p>
Hashtablel承自Dictionaryc,而HashMap?a class="channel_keylink" target="_blank">Java1.2引进的Map interface的一个实现?/p>
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap 必Mؓ之提供外同步。Hashtable和HashMap采用的hash/rehash法都大概一P所以性能不会有很大的差异?/p>
2.2 finalQ?finallyQ?finalize的区别?/strong>
final 用于声明属性,Ҏ和类Q分别表C属性不可变Q方法不可覆盖,cM可ѝ?/p>
finally是异常处理语句结构的一部分Q表CL执行?/p>
finalize是Objectcȝ一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回Ӟ例如关闭文g{?/p>
2.3 sleepQ) ?waitQ) 有什么区别?
sleep是线E类QThreadQ的ҎQ导致此U程暂停执行指定旉Q给执行Zl其他线E,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁?/p>
wait是ObjectcȝҎQ对此对象调用waitҎD本线E放弃对象锁Q进入等待此对象的等待锁定池Q只有针Ҏ对象发出notifyҎQ或notifyAllQ后本线E才q入对象锁定池准备获得对象锁q入q行状态?/p>
2.4 Overload和Override的区别。Overloaded的方法是否可以改变返回值的cdQ?/strong>
Ҏ的重写Overriding和重载Overloading?a class="channel_keylink" target="_blank">Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?QOverridingQ。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重载(OverloadingQ。Overloaded的方法是可以改变q回值的cd?/p>
2.5 error和exception有什么区别?
error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?/p>
exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?/p>
2.6 同步和异步有何异同,在什么情况下分别使用他们QD例说明?/strong>
如果数据在U程间共享。例如正在写的数据以后可能被另一个线E读刎ͼ或者正在读的数据可能已l被另一个线E写q了Q那么这些数据就是共享数据,必须q行同步存取?/p>
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,q且不希望让E序{待Ҏ的返回时Q就应该使用异步~程Q在很多情况下采用异步途径往往更有效率?/p>
2.7 abstract class和interface有什么区别?
声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?/p>
接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?/p>
2.8 heap和stack有什么区别?/strong>
栈是一U线形集合,其添加和删除元素的操作应在同一D完成。栈按照后进先出的方式进行处理?/p>
堆是栈的一个组成元素?/p>
2.9 forward 和redirect的区?/strong>
forward?a class="channel_keylink" target="_blank">服务?/a>h资源Q?a class="channel_keylink" target="_blank">服务?/a>直接讉K目标地址的URLQ把那个URL的响应内容读取过来,然后把这些内容再发给览器,览器根本不知道服务器发送的内容是从哪儿来的Q所以它的地址栏中q是原来的地址?/p>
redirect是服务端根据逻辑Q发送一个状态码Q告诉浏览器重新去请求那个地址Q一般来说浏览器会用刚才h的所有参数重新请求,所以sessionQrequest参数都可以获取?/p>
2.10 EJB与Java Bean的区别?
Java Bean 是可复用的组Ӟ对Java Beanq没有严格的规范Q理ZԌM一个Javac都可以是一个Bean.但通常情况下,׃Java Bean是被容器所创徏Q如TomcatQ的Q所以Java Bean应具有一个无参的构造器Q另外,通常Java Beanq要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微YCOM模型中的本地q程内COMlgQ它是不能被跨进E访问的。Enterprise Java Bean 相当于DCOMQ即分布式组件。它是基于Java的远E方法调用(RMIQ技术的Q所以EJB可以被远E访问(跨进E、跨计算机)。但EJB必须被布|在诸如Webspere、WebLogicq样的容器中QEJB客户从不直接讉K真正的EJBlgQ而是通过其容器访问。EJB容器是EJBlg的代理,EJBlg由容器所创徏和管理。客户通过容器来访问真正的EJBlg?/p>
抽象是忽略一个主题中与当前目标无关的那些斚wQ以便更充分地注意与当前目标有关的方面。抽象ƈ不打了解全部问题,而只是选择其中的一部分Q暂时不用部分细节。抽象包括两个方面,一是过E抽象,二是数据抽象?/p>
2.l承Q?/strong>
l承是一U联l类的层ơ模型,q且允许和鼓q的重用,它提供了一U明表q共性的Ҏ。对象的一个新cd以从现有的类中派生,q个q程UCؓcȝѝ新cȝ承了原始cȝҎ,新类UCؓ原始cȝzc(子类Q,而原始类UCؓ新类的基c(父类Q。派生类可以从它的基c那里承方法和实例变量Qƈ且类可以修改或增加新的方法之更适合Ҏ的需要?/p>
3.装Q?/strong>
装是把q程和数据包围v来,Ҏ据的讉K只能通过已定义的界面。面向对象计始于这个基本概念,即现实世界可以被描绘成一pd完全自治、封装的对象Q这些对象通过一个受保护的接口访问其他对象?/p>
4.多态性:
多态性是指允怸同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语ah灉|、抽象、行为共享、代码共享的优势Q很好的解决了应用程序函数同名问题?/p>
二、String是最基本的数据类型吗Q?/strong>
基本数据cd包括byte、int、char、long、float、double、boolean和short. java.lang.StringcLfinalcd的,因此不可以承这个类、不能修改这个类。ؓ了提高效率节省空_我们应该用StringBuffercR?/p>
三、int ?Integer 有什么区别?
Java 提供两种不同的类型:引用cd和原始类型(或内|类型)。int?a class="channel_keylink" target="_blank">Java的原始数据类型,Integer是Java为int提供的封装类。Java为每个原始类型提供了装cR?/p>
原始cd装c?/p>
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用cd和原始类型的行ؓ完全不同Qƈ且它们具有不同的语义。引用类型和原始cdh不同的特征和用法Q它们包括:大小和速度问题Q这U类型以哪种cd的数据结?a class="channel_keylink" target="_blank">存储Q当引用cd和原始类型用作某个类的实例数据时所指定的缺省倹{对象引用实例变量的~省gؓ nullQ而原始类型实例变量的~省g它们的类型有兟?/p>
四、String 和StringBuffer的区别?
Javaq_提供了两个类QString和StringBufferQ它们可以储存和操作字符Ԍ卛_含多个字W的字符数据。这个StringcL供了数g可改变的字符丌Ӏ而这个StringBuffercL供的字符串进行修攏V当你知道字W数据要改变的时候你可以用StringBuffer.典型圎ͼ你可以用StringBuffer来动态构造字W数据?/p>
五、运行时异常与一般异常有何异同?
异常表示E序q行q程中可能出现的非正常状态,q行时异常表C拟机的通常操作中可能遇到的异常Q是一U常见运行错误。Java~译器要求方法必d明抛出可能发生的非运行时异常Q但是ƈ不要求必d明抛出未被捕Lq行时异常?/p> 六、说出Servlet的生命周期,q说出Servlet和CGI的区别?
Servlet?a class="channel_keylink" target="_blank">服务?/a>实例化后Q容器运行其initҎQ请求到达时q行其serviceҎQserviceҎ自动zNq行与请求对应的doXXXҎQdoGetQdoPostQ等Q当服务?/a>军_实例销毁的时候调用其destroyҎ?/p>
与CGI的区别在于Servlet处于服务器进E中Q它通过多线E方式运行其serviceҎQ一个实例可以服务于多个hQƈ且其实例一般不会销毁,而CGIҎ个请求都产生新的q程Q服务完成后销毁,所以效率上低于CGI. 七、说出ArrayListQVectorQ?LinkedList?a class="channel_keylink" target="_blank">存储
ArrayList和Vector都是使用数组方式存储数据Q此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素Q但是插入元素要涉及数组元素Ud{内存操作,所以烦引数据快而插入数据慢QVector׃使用了synchronizedҎQ线E?a class="channel_keylink" target="_blank">安全Q,通常性能上较ArrayList差,而LinkedList使用双向链表实现存储Q按序号索引数据需要进行前向或后向遍历Q但是插入数据时只需要记录本的前后即可,所以插入速度较快?/p>
八、EJB是基于哪些技术实现的Qƈ说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别?/strong>
EJB包括Session Bean、Entity Bean、Message Driven BeanQ基于JNDI、RMI、JAT{技术实现?/p>
SessionBean在J2EE应用E序中被用来完成一些服务器端的业务操作Q例如访问数据库、调用其他EJBlg。EntityBean被用来代表应用系l中用到的数据?/p>
对于客户机,SessionBean是一U非持久性对象,它实现某些在服务器上q行的业务逻辑?/p>
对于客户机,EntityBean是一U持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用E序实现的实体?/p>
Session Bean q可以再l分?Stateful Session Bean ?Stateless Session Bean Q这两种?Session Bean都可以将pȝ逻辑攑֜ method之中执行Q不同的?Stateful Session Bean 可以记录呼叫者的状态,因此通常来说Q一个用者会有一个相对应?Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑lgQ但是他却不负责记录使用者状态,也就是说当用者呼?Stateless Session Bean 的时候,EJB Container q不会找ȝ定的 Stateless Session Bean 的实体来执行q个 method.换言之,很可能数个用者在执行某个 Stateless Session Bean ?methods Ӟ会是同一?Bean ?Instance 在执行。从内存斚w来看Q?Stateful Session Bean ?Stateless Session Bean 比较Q?Stateful Session Bean 会消?J2EE Server 较多的内存,然?Stateful Session Bean 的优势却在于他可以维持用者的状态?/p>
九、Collection ?Collections的区别?/strong>
Collection是集合类的上U接口,l承与他的接口主要有Set 和List.
Collections是针寚w合类的一个帮助类Q他提供一pd静态方法实现对各种集合的搜索、排序、线E?a class="channel_keylink" target="_blank">安全化等操作?/p>
十?amp;?amp;&的区别?/strong>
&是位q算W,表示按位与运,&&是逻辑q算W,表示逻辑与(andQ?/p>
JVM : Java Virtual Machine(Java虚拟? 。所?#8220;虚拟?#8221;思义是模拟出来的东ѝ就像是我们在用电脑看电视,但是电脑里ƈ没有像电视机里面一Lg支持Q但是我们仍然可以从电脑里接受电视台的节目。那是因为我们编写了一个可以模拟电视机g工作的Y件运行在电脑的^C面的原因。同样JVM是模拟了电脑的gQ它同样有着像CPU一样可以执行代码的功能。它的实现具体有Q指令集 寄存器组 cL件格??垃圾攉?内存区。可以把它理解成是专门用来执行JavaE序的一台机器。也是说JVM提供了Java执行的硬件^台。JVM上执行的代码都存攑֜ .CLASS 文g中。JVM只执行字节码文g?/p>
JRE : Java Runtime Environment(Javaq行环境)。就是可以运行JavaE序的地斏V就像是我们要在电脑上运行一个视频Y件的时候必dWindos或者是Linux{操作系l上一栗那我们可以把它看做是一个操作系l。也是说JRE提供了Java执行的Y件^台。在q行Java的过E中除了需要有JVM执行Java代码q个动作外,q需要Java API(Application Programming Interface,应用~程接口)说简单的是“cd”。JavaE序在运行中没有q些API是不行的Q所以JRE包含JVM?/p>
JDK : Java Development ToolKit(Java开发工具包)。我们有了硬件和软g两个q_后就可以做我们自己想做的事情了。JDK是我们用来做事情的工具Q它包括JREq有其他工具。我们所说版本的不同Q也是说它里面的工h差异。就像是你不同的工具里攄不同的工具一栗D个例子:最常用的一个就是javac,它是?java的文件翻译成.class文g的工兗然后让JVM来执?class文g中的字节码?像电脑的CPU只认??的道?
如果一台计机的需求只是运行JavaE序Q而不是去~写JavaE序的时候,它只需要安装JRE可以了。现在大家知道JVM JRE JDKQ这些东西到底是什么了吧?/p>
异常是程序运行过E中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框Ӟ是Java语言健壮性的一个重要体现?/p>
Java把异常当作对象来处理Qƈ定义一个基cjava.lang.Throwable作ؓ所有异常的类。在Java API中已l定义了许多异常c,q些异常cdZ大类Q错误Error和异常Exception。Java异常体系l构呈树Ӟ其层ơ结构图如图 1所C:
1、Error与Exception
Error是程序无法处理的错误Q比如OutOfMemoryError、ThreadDeath{。这些异常发生时QJava虚拟机(JVMQ一般会选择U程l止?/p>
Exception是程序本w可以处理的异常Q这U异常分两大c运行时异常和非q行时异常。程序中应当可能去处理q些异常?/p>
2、运行时异常和非q行时异?/strong>
q行时异帔R是RuntimeExceptioncd其子cd常,如NullPointerException、IndexOutOfBoundsException{,q些异常是不查异常,E序中可以选择捕获处理Q也可以不处理。这些异怸般是q序逻辑错误引v的,E序应该从逻辑角度可能避免这cd常的发生?/p>
非运行时异常是RuntimeException以外的异常,cd上都属于Exceptioncd其子cR从E序语法角度讲是必须q行处理的异常,如果不处理,E序׃能编译通过。如IOException、SQLException{以及用戯定义的Exception异常Q一般情况下不自定义查异常?br /> 二?nbsp;异常的捕获和处理
Java异常的捕获和处理是一个不Ҏ把握的事情,如果处理不当Q不但会让程序代码的可读性大大降低,而且Dpȝ性能低下Q甚臛_发一些难以发现的错误?/p>
Java异常处理涉及C个关键字Q分别是Qtry、catch、finally、throw、throws。下面将骤一介绍Q通过认识q五个关键字Q掌握基本异常处理知识?/p>
1?nbsp;异常处理的基本语?br /> 在java中,异常处理的完整语法是Q?br />
try{ //Q尝试运行的Q程序代?br /> }catch(异常cd 异常的变量名){ //异常处理代码 }finally{ //异常发生Q方法返回之前,L要执行的代码 } |
以上语法有三个代码块Q?br /> try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常Ӟ会抛出异常对象?/p>
catch语句块会捕获try代码块中发生的异常ƈ在其代码块中做异常处理,catch语句带一个Throwablecd的参敎ͼ表示可捕获异常类型。当try中出现异常时Qcatch会捕获到发生的异常,q和自己的异常类型匹配,若匹配,则执行catch块中代码Qƈcatch块参数指向所抛的异常对象。catch语句可以有多个,用来匚w多个中的一个异常,一旦匹配上后,׃再尝试匹配别的catch块了。通过异常对象可以获取异常发生时完整的JVM堆栈信息Q以及异怿息和异常发生的原因等?/p>
finally语句块是紧跟catch语句后的语句块,q个语句块L会在Ҏq回前执行,而不是否try语句块是否发生异常。ƈ且这个语句块L在方法返回前执行。目的是l程序一个补救的Z。这样做也体CJava语言的健壮性?/p>
2?nbsp;try、catch、finally三个语句块应注意的问?br /> W一、try、catch、finally三个语句块均不能单独使用Q三者可以组?try...catch...finally、try...catch、try...finally三种l构Qcatch语句可以有一个或多个Qfinally语句最多一个?br /> W二、try、catch、finally三个代码块中变量的作用域Z码块内部Q分别独立而不能相互访问。如果要在三个块中都可以讉KQ则需要将变量定义到这些块的外面?br /> W三、多个catch块时候,只会匚w其中一个异常类q执行catch块代码,而不会再执行别的catch块,q且匚wcatch语句的顺序是׃C?/p>
3、throw、throws关键?br /> throw关键字是用于Ҏ体内部,用来抛出一个Throwablecd的异常。如果抛Z查异常,则还应该在方法头部声明方法可能抛出的异常cd。该Ҏ的调用者也必须查处理抛出的异常。如果所有方法都层层上抛获取的异常,最lJVM会进行处理,处理也很单,是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeExceptionQ则该方法的调用者可选择处理该异常。有兛_常的转译会在下面说明?/p>
throws关键字用于方法体外部的方法声明部分,用来声明Ҏ可能会抛出某些异常。仅当抛Z查异常,该方法的调用者才必须处理或者重新抛异常。当Ҏ的调用者无力处理该异常的时候,应该l箋抛出Q而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给Z个简单例子,看看如何使用q两个关键字Q?br />
public static void test3() throws Exception{ //抛出一个检查异?br /> throw new Exception("Ҏtest3中的Exception"); } 3?nbsp;ThrowablecM的常用方?br /> getCause()Q返回抛出异常的原因。如?cause 不存在或未知Q则q回 null?br /> getMessage()Q返回异常的消息信息?br /> printStackTrace()Q对象的堆栈跟踪输出至错误输出流Q作为字D?System.err 的倹{?/p> |
三?nbsp;异常处理的一般原?
1?nbsp;能处理就早处理,抛出不去q不能处理的想法消化掉或者{换ؓRuntimeException处理。因为对于一个应用系l来_抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能?br /> 2?nbsp;对于查异常,如果不能行之有效的处理,q不如{换ؓRuntimeException抛出。这样也让上层的代码有选择的余地――可处理也可不处理?br /> 3?nbsp;对于一个应用系l来_应该有自q一套异常处理框Ӟq样当异常发生时Q也能得到统一的处理风|优雅的异常信息反馈l用戗?/p>
四?nbsp;异常的{译与异常?/font>
1、异常{译的原理
所谓的异常转译是一U异常{换另一U新的异常,也许q种新的异常更能准确表达E序发生异常?/p>
在Java中有个概念就是异常原因,异常原因D当前抛出异常的那个异常对象,几乎所有带异常原因的异常构造方法都使用Throwablecd做参敎ͼq也׃ؓ异常的{译提供了直接的支持,因ؓM形式的异常和错误都是Throwable的子cR比如将SQLException转换为另外一个新的异常DAOExceptionQ可以这么写Q?/p>
先自定义一个异常DAOExceptionQ?/p>
public class DAOException extends RuntimeException { //(省略了部分代? public DAOException(String message, Throwable cause) { super(message, cause); } } |
DAOException daoEx = new DAOException ( "SQL异常", e);
异常转译是针Ҏ有承Throwable类的类而言的,从编E的语法角度Ԍ其子cM间都可以怺转换。但是,从合理性和pȝ设计角度考虑Q可异常分Zc:Error、Exception、RuntimeExceptionQ笔者认为,合理的{译关pd应该如图 2Q?/p>
?/span> 2 异常转译
Z么要q么做呢Q笔者认为,异常的处理存在着一套哲学思想Q?strong>对于一个应用系l来_pȝ所发生的Q何异常或者错误对操作用户来说都是pȝ"q行?异常Q都是这个应用系l内部的异常。这也是异常转译和应用系l异常框架设计的指导原则?/strong>在系l中大量处理非检查异常的负面影响很多Q最重要的一个方面就是代码可L降低,E序~写复杂Q异常处理的代码也很苍白无力。因此,很有必要这些检查异常Exception和错误Error转换为RuntimeException异常Q让E序员根据情冉|军_是否捕获和处理所发生的异常?/p>
图中的三条线标识转换的方向,分三U情况:
①:Error到ExceptionQ将错误转换为异常,ql抛出。例如Spring WEB框架中,org.springframework.web.servlet.DispatcherServlet的doDispatch()Ҏ中,捕L错误转译Z个NestedServletException异常。这样做的目的是Z最大限度挽回因错误发生带来的负面媄响。因Z个Error常常是很严重的错误,可能会引Ll挂赗?/p>
②:Exception到RuntimeExceptionQ将查异常{换ؓRuntimeException可以让程序代码变得更优雅Q让开发h员集中经理设计更合理的程序代码,反过来也增加了系l发生异常的可能性?/p>
③:Error到RuntimeExceptionQ目的还是一L。把所有的异常和错误{译ؓ不检查异常,q样可以让代码更为简z,q有利于寚w误和异常信息的统一处理?/p>
1?nbsp;异常?/strong>
异常N名思义是异常发生的原因一个传一个串hQ即把底层的异常信息传给上层Q这样逐层抛出。Java API文档中给Z一个简单的模型Q?/p>
try { lowLevelOp(); } catch (LowLevelException le) { throw (HighLevelException) new HighLevelException().initCause(le); } |
当程序捕获到了一个底层异常leQ在处理部分选择了l抛Z个更高别的新异常给此方法的调用者。这样异常的原因׃逐层传递。这P位于高层的异帔R归调用getCause()ҎQ就可以遍历各层的异常原因。这是Java异常铄原理。异帔R的实际应用很,发生异常时候逐层上抛不是个好注意Q上层拿到这些异常又能奈之何Q而且异常逐层上抛会消耗大量资源,因ؓ要保存一个完整的异常链信?/p>
五?nbsp;设计一个高效合理的异常处理框架
对于一个应用系l来_发生所有异常在用户看来都是应用pȝ内部的异常。因此应该设计一套应用系l的异常框架Q以处理pȝq行q程中的所有异常?/p>
Zq种观点Q可以设计一个应用系l的异常比如叫做AppException。ƈ且对用户来说Q这些异帔R是运行应用系l运行时发生的,因此AppException应该l承RuntimeExceptionQ这Ll中所有的其他异常都{译ؓAppExceptionQ当异常发生的时候,前端接收到AppExcetpionq做l一的处理。画出异常处理框架如?3 Q?/p>
?/span> 3 一个应用系l的异常处理框架
在这个设计图中,AppRuntimeException是系l异常的基类Q对外只抛出q个异常Q这个异常可以由前端Q客LQ接收处理,当异常发生时Q客L的相关组件捕获ƈ处理q些异常Q将"友好"的信息展C给客户?/p>
在AppRuntimeException下层Q有各种各样的异常和错误Q最l都转译为AppRuntimeExceptionQAppRuntimeException下面q可以设计一些别的子cd常,比如AppDAOException、OtherException{,q些都根据实际需要灵zd理。在往下就是如何将捕获的原始异常比如SQLException、HibernateException转换为更高一点AppDAOException?/p>
有关异常框架设计q方面公认比较好的就是SpringQSpring中的所有异帔R可以用org.springframework.core.NestedRuntimeException来表C,q且该基cȝ承的是RuntimeException。Spring框架很庞大,因此设计了很多NestedRuntimeException的子c,q有异常转换的工Pq些都是非常优秀的设计思想?/p>
六?nbsp;Java异常处理ȝ
回顾全文Qȝ一下Java异常处理的要点:
1?nbsp;异常是程序运行过E过E出现的错误Q在Java中用cL描述Q用对象来表C具体的异常。Java其区分为Error与ExceptionQError是程序无力处理的错误QException是程序可以处理的错误。异常处理是ZE序的健壮性?br /> 2?nbsp;Java异常cL自于Java API定义和用h展。通过l承Java API异常cd以实现异常的转译?br /> 3?nbsp;异常能处理就处理Q不能处理就抛出Q最l没有处理的异常JVM会进行处理?br /> 4?nbsp;异常可以传播Q也可以怺转译Q但应该Ҏ需要选择合理的异常{译的方向?br /> 5?nbsp;对于一个应用系l,设计一套良好的异常处理体系很重要。这一点在pȝ设计的时候就应该考虑到?br />