自由飞翔

我在仰望,java之上

统计

留言簿(2)

我关注的blog

阅读排行榜

评论排行榜

#

操作properties

properties解析.....

posted @ 2011-09-30 01:27 GavinMiao 阅读(244) | 评论 (0)编辑 收藏

操作xml

待续........

posted @ 2011-09-30 01:25 GavinMiao 阅读(233) | 评论 (0)编辑 收藏

转载:JAVA异常机制介绍/如何正确的进行JAVA异常处理

 文章来源:
 作者:Maverick
 blog:http://blog.csdn.net/zhaohuabing  

1  引言
在JAVA语言出现以前,传统的异常处理方式多采用返回值来标识程序出现的异常情况,这种方式虽然为程序员所熟悉,但却有多个坏处。首先,一个API可以返回任意的返回值,而这些返回值本身并不能解释该返回值是否代表一个异常情况发生了和该异常的具体情况,需要调用API的程序自己判断并解释返回值的含义。其次,并没有一种机制来保证异常情况一定会得到处理,调用程序可以简单的忽略该返回值,需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长,当进行IO操作等容易出现异常情况的处理时,你会发现代码的很大部分用于处理异常情况的switch分支,程序代码的可读性变得很差。
上面提到的问题,JAVA的异常处理机制提供了很好的解决方案。通过抛出JDK预定义或者自定义的异常,能够表明程序中出现了什么样的异常情况;而且JAVA的语言机制保证了异常一定会得到恰当的处理;合理的使用异常处理机制,会让程序代码清晰易懂。
2 JAVA异常的处理机制
    当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往下执行程序,try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块,在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后,遇到异常的当前线程被中止。
3 JAVA异常的类层次
JAVA异常的类层次如下图所示:

图1 JAVA异常的类层次
Throwable是所有异常的基类,程序中一般不会直接抛出Throwable对象,Exception和Error是Throwable的子类,Exception下面又有RuntimeException和一般的Exception两类。可以把JAVA异常分为三类:
        第一类是Error,Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常;一般情况下,在程序中也不应该抛出Error类型的异常。
        第二类是RuntimeException, RuntimeException 是一种unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。
        第三类是一般的checked Exception,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception,如图1中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。checked Exception用于以下的语义环境:

(1) 该异常发生后是可以被恢复的,如一个Internet连接发生异常被中止后,可以重新连接再进行后续操作。
(2) 程序依赖于不可靠的外部条件,该依赖条件可能出错,如系统IO。
(3) 该异常发生后并不会导致程序处理错误,进行一些处理后可以继续后续操作。

4 JAVA异常处理中的注意事项
合理使用JAVA异常机制可以使程序健壮而清晰,但不幸的是,JAVA异常处理机制常常被错误的使用,下面就是一些关于Exception的注意事项:

1. 不要忽略checked Exception
请看下面的代码:
try
{
  method1();  //method1抛出ExceptionA
}
catch(ExceptionA e)
{
    e.printStackTrace();
}
上面的代码似乎没有什么问题,捕获异常后将异常打印,然后继续执行。事实上在catch块中对发生的异常情况并没有作任何处理(打印异常不能是算是处理异常,因为在程序交付运行后调试信息就没有什么用处了)。这样程序虽然能够继续执行,但是由于这里的操作已经发生异常,将会导致以后的操作并不能按照预期的情况发展下去,可能导致两个结果:
一是由于这里的异常导致在程序中别的地方抛出一个异常,这种情况会使程序员在调试时感到迷惑,因为新的异常抛出的地方并不是程序真正发生问题的地方,也不是发生问题的真正原因;
另外一个是程序继续运行,并得出一个错误的输出结果,这种问题更加难以捕捉,因为很可能把它当成一个正确的输出。
那么应该如何处理呢,这里有四个选择:

(1) 处理异常,进行修复以让程序继续执行。
(2) 重新抛出异常,在对异常进行分析后发现这里不能处理它,那么重新抛出异常,让调用者处理。
(3) 将异常转换为用户可以理解的自定义异常再抛出,这时应该注意不要丢失原始异常信息(见5)。
(4) 不要捕获异常。

因此,当捕获一个unchecked Exception的时候,必须对异常进行处理;如果认为不必要在这里作处理,就不要捕获该异常,在方法体中声明方法抛出异常,由上层调用者来处理该异常。

2. 不要一次捕获所有的异常
请看下面的代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(Exception e)
{
    ……
}
这是一个很诱人的方案,代码中使用一个catch子句捕获了所有异常,看上去完美而且简洁,事实上很多代码也是这样写的。但这里有两个潜在的缺陷,一是针对try块中抛出的每种Exception,很可能需要不同的处理和恢复措施,而由于这里只有一个catch块,分别处理就不能实现。二是try块中还可能抛出RuntimeException,代码中捕获了所有可能抛出的RuntimeException而没有作任何处理,掩盖了编程的错误,会导致程序难以调试。
下面是改正后的正确代码:
try
{
  method1();  //method1抛出ExceptionA
    method2();  //method1抛出ExceptionB
    method3();  //method1抛出ExceptionC
}
catch(ExceptionA e)
{
    ……
}
catch(ExceptionB e)
{
    ……
}
catch(ExceptionC e)
{
    ……
}


3. 使用finally块释放资源
    finally关键字保证无论程序使用任何方式离开try块,finally中的语句都会被执行。在以下三种情况下会进入finally块:
(1) try块中的代码正常执行完毕。
(2) 在try块中抛出异常。
(3) 在try块中执行return、break、continue。
因此,当你需要一个地方来执行在任何情况下都必须执行的代码时,就可以将这些
代码放入finally块中。当你的程序中使用了外界资源,如数据库连接,文件等,必须将释放这些资源的代码写入finally块中。
必须注意的是,在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后在离开try块,因此在try块中发生异常的时候,JAVA虚拟机先转到finally块执行finally块中的代码,finally块执行完毕后,再向外抛出异常。如果在finally块中抛出异常,try块捕捉的异常就不能抛出,外部捕捉到的异常就是finally块中的异常信息,而try块中发生的真正的异常堆栈信息则丢失了。
请看下面的代码:

Connection  con = null;
try
{
    con = dataSource.getConnection();
    ……
}
catch(SQLException e)
{
    ……
    throw e;//进行一些处理后再将数据库异常抛出给调用者处理
}
finally
{
    try
    {
        con.close();
    }
    catch(SQLException e)
{
    e.printStackTrace();
    ……
}
}
运行程序后,调用者得到的信息如下
java.lang.NullPointerException
 at myPackage.MyClass.method1(methodl.java:266)
而不是我们期望得到的数据库异常。这是因为这里的con是null的关系,在finally语句中抛出了NullPointerException,在finally块中增加对con是否为null的判断可以避免产生这种情况。

4. 异常不能影响对象的状态
异常产生后不能影响对象的状态,这是异常处理中的一条重要规则。 在一个函数
中发生异常后,对象的状态应该和调用这个函数之前保持一致,以确保对象处于正确的状态中。
如果对象是不可变对象(不可变对象指调用构造函数创建后就不能改变的对象,即
    创建后没有任何方法可以改变对象的状态),那么异常发生后对象状态肯定不会改变。如果是可变对象,必须在编程中注意保证异常不会影响对象状态。有三个方法可以达到这个目的:
(1) 将可能产生异常的代码和改变对象状态的代码分开,先执行可能产生异常的代码,如果产生异常,就不执行改变对象状态的代码。
(2) 对不容易分离产生异常代码和改变对象状态代码的方法,定义一个recover方法,在异常产生后调用recover方法修复被改变的类变量,恢复方法调用前的类状态。
(3) 在方法中使用对象的拷贝,这样当异常发生后,被影响的只是拷贝,对象本身不会受到影响。

5. 丢失的异常
请看下面的代码:
public void method2()
{
try
{
    ……
    method1();  //method1进行了数据库操作
}
catch(SQLException e)
{
    ……
    throw new MyException(“发生了数据库异常:”+e.getMessage);
}
}
public void method3()
{
    try
{
    method2();
}
catch(MyException e)
{
    e.printStackTrace();
    ……
}
}
上面method2的代码中,try块捕获method1抛出的数据库异常SQLException后,抛出了新的自定义异常MyException。这段代码是否并没有什么问题,但看一下控制台的输出:
MyException:发生了数据库异常:对象名称 'MyTable' 无效。
at MyClass.method2(MyClass.java:232)
at MyClass.method3(MyClass.java:255)
原始异常SQLException的信息丢失了,这里只能看到method2里面定义的MyException的堆栈情况;而method1中发生的数据库异常的堆栈则看不到,如何排错呢,只有在method1的代码行中一行行去寻找数据库操作语句了,祈祷method1的方法体短一些吧。
JDK的开发者们也意识到了这个情况,在JDK1.4.1中,Throwable类增加了两个构造方法,public Throwable(Throwable cause)和public Throwable(String message,Throwable cause),在构造函数中传入的原始异常堆栈信息将会在printStackTrace方法中打印出来。但对于还在使用JDK1.3的程序员,就只能自己实现打印原始异常堆栈信息的功能了。实现过程也很简单,只需要在自定义的异常类中增加一个原始异常字段,在构造函数中传入原始异常,然后重载printStackTrace方法,首先调用类中保存的原始异常的printStackTrace方法,然后再调用super.printStackTrace方法就可以打印出原始异常信息了。可以这样定义前面代码中出现的MyException类:
public class MyExceptionextends Exception
{
    //构造函数
    public SMException(Throwable cause)
    {
        this.cause_ = cause;
    }

    public MyException(String s,Throwable cause)
    {
        super(s);
        this.cause_ = cause;
    }
    //重载printStackTrace方法,打印出原始异常堆栈信息
    public void printStackTrace()
    {
        if (cause_ != null)
        {
            cause_.printStackTrace();
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintStream s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }

    public void printStackTrace(PrintWriter s)
    {
        if (cause_ != null)
        {
            cause_.printStackTrace(s);
        }
        super.printStackTrace(s);
    }
     //原始异常
     private Throwable cause_;
}

6. 不要使用同时使用异常机制和返回值来进行异常处理
下面是我们项目中的一段代码
try
{
    doSomething(); 
}
catch(MyException e)
{
if(e.getErrcode == -1)
{
    ……
}
if(e.getErrcode == -2)
{
   ……
}
……
}
假如在过一段时间后来看这段代码,你能弄明白是什么意思吗?混合使用JAVA异常处理机制和返回值使程序的异常处理部分变得“丑陋不堪”,并难以理解。如果有多种不同的异常情况,就定义多种不同的异常,而不要像上面代码那样综合使用Exception和返回值。
修改后的正确代码如下:
try
{
    doSomething();  //抛出MyExceptionA和MyExceptionB
}
catch(MyExceptionA e)
{
……
}
catch(MyExceptionB e)
{
    ……
}


7. 不要让try块过于庞大
出于省事的目的,很多人习惯于用一个庞大的try块包含所有可能产生异常的代码,
这样有两个坏处:
阅读代码的时候,在try块冗长的代码中,不容易知道到底是哪些代码会抛出哪些异常,不利于代码维护。
使用try捕获异常是以程序执行效率为代价的,将不需要捕获异常的代码包含在try块中,影响了代码执行的效率。

posted @ 2011-09-30 01:08 GavinMiao 阅读(334) | 评论 (0)编辑 收藏

MyEclipse添加注释模板

     摘要: 参考文章:http://apps.hi.baidu.com/share/detail/34719991  打开MyEclipse1windows-preferences-Java-Code style-Code Templates2然后导入就行了3 注释模板的xml文件解释:例子:<?xml version="1.0" encoding="UTF-8"?><t...  阅读全文

posted @ 2011-09-29 19:59 GavinMiao 阅读(4142) | 评论 (0)编辑 收藏

ActionMessage与ActionError

参考文章:http://hi.baidu.com/develop_skill/blog/item/e09b2d8664cddf2dc75cc36b.html

 如果是想获取error的话,name = org.apache.struts.action.ERROR
 如果是想获取message的话, name = org.apache.struts.action.ACTION_MESSAGE

1.src目录下新建属性文件HtmlErrors.properties,里面有一些key=walue
2.
在struts-config.xml中加入 <message-resources key="HtmlErrors" parameter="HtmlErrors"/>
3.
在action类中声明ActionMessages 属性,并且在setServlet方法 中初始化之 messages = new ActionMessages();
在execute中,添加message:
messages.add("message",new ActionMessage("key")); this.saveErrors(request,messages);//注意此处必须是saveErrors,用saveMessages无效
4.
在jsp文件中加入:
<logic:messagesPresent> <html:errors property="message" bundle="HtmlErrors"> </html:errors> </logic:messagesPresent>

ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.

  • ActionMessage 
    • ActionMessage(String key)
      该方法接受一个字符串,字符串是在资源文件种配置的key值,必须在配置文件中进行相关配置.
    • ActionMessage(String key,Object value)
      ActionMessage(String key,Object value0,Object value1)
      ActionMessage(String key,Object value0,Object value1,Object value2)
      ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
      上面4个方法第一个参数同样是资源文件中配置的key值,同样必须在配置文件中进行相关配置.后面的参数为资源文件中key所对应的信息中需要的参数
    • ActionMessage(String key,Object[] values)
      这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.
    • ActionMessage(String msg,false 这个方法显示自定义消息,即消息输出内容为msg。
  • ActionMessages
    • ActionMessages.add(String property,ActionMessage message)
      第一个参数property对应于<html:messages>标签中的property属性
      , property的值一般采用ActionMessages类中的静态常量ActionMessages.GLOBAL_MESSAGE,也可以自己定义一个key.
    • 该方法执行时,先判断ActionMessages中有没有该key,如果没有就新添加对key-List键值对;如果有同样的key,就先获取该key对应的Value并转换为List对象,然后将(ActionMessage)message添加进List对象中.
    • ActionMessages.add(ActionMessages ams)
      该方法将参数中保存的ActionMessage合并到调用ActionMessages中.
  • Action及其所有子类
    • addMessages(HttpServletRequest request,ActionMessages messages)
      该方法首先检查request对象中是否有ActionMessages对象,如果有对象,则将接收的ActionMessages合并到request中,如果没有,用setAttribute(Globals.MESSAGE_KEY,messages)方法将messages添加进去.如果一个Action中需要显示多条错误信息,推荐使用该方法.
      (Globals.MESSAGE_KEY ="org.apache.struts.action.ACTION_MESSAGE")
    • saveMessages(HttpServletRequest request,ActionMessages messages)
      该方法保存messages时,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.
    • addErrors()和saveErrors()
      这两个方法与addMessages()和saveMessages()相似,不过在HttpServletRequest.setAttribute()时的参数不一样,这两个方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
           在request中添加的ActionMessages在页面显示时,用<html:messages>标签进行显示, <html:messages>
id必须指定id属性.<html:messages>标签作用是遍历ActionMessages对象中的所有     ActionMessage.类似<logic:iterator>,每次循环都定义一个名称为id指定的页面范围的bean,然后用     <bean:write>标签进行输出.
bundle绑定一个MessageResources,不指定的时候从上下文中配置的资源中检索.一般不指定bundle属性.
locale指定本地化信息,不指定时和Session的本地化信息相同,一般不用指定.
name指定ActionMessages对象在request中的key.不指定时,默认用GLOBALS.ERROR_KEY="org.apache.struts.action.ERROR",用Action.addMessages()方法添加的信息将不被显示,用Action.addErrors()方法添加的信息才会被显示.一般不指定.
property指定哪些ActionMessage将被显示,与ActionMessages.addMessage(String property,ActionMessage am)中的property参数相对应.不指定的时候显示所有信息.
header指定一个资源信息key,在显示ActionMessages前打印到页面上,可选.
footer指定一个资源信息key,在显示完ActionMessages后打印到页面上,可选.
message

取值为true/false,默认为false.为false或不指定时,在request中查找key=Globals.ERROR_KEY的ActionMessages bean.当该属性设置为true时,在request中查找key=Globals.MESSAGE_KEY的ActionMessages bean,同时name属性的值将被忽略. 
注:true显示 this.addMessages(request,messages); 里面的消息,
false显示 this.addErrors(request, messages)的消息。

 <html:messages>的message属性如果设定为true,会输出ActionMessages中所储存的讯息,Message表示一个提示讯息,也许使用者输入了不正确的资讯,例如在输入名称与密码时打错了字,程式要提示使用者他们输入了不正确的讯息。 
    <html:messages>的message属性如果不设定为true,会输出ActionErrors中所储存的讯息,Error代表的是一个操作方面的错误,例如错误操作导致使用者名称或密码为空(当然也许也是故意的)。

示例:(struts 1.3)

ActionForm中:

ActionMessages messages = new ActionMessages();
    messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("messages.username.required"));
    addMessages(request,messages);
   
    ActionErrors errors = new ActionErrors();
    errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.username.required"));
    addErrors(request,errors);
   
    return mapping.getInputForward();

===========================================================================

JSP页面显示:

<html:messages id="outMessage" message="true" header="messages.header" footer="messages.footer">
    <bean:write name="outMessage"/>
   </html:messages>
   <html:messages id="outError" message="false" header="errors.header" footer="errors.footer">
    <bean:write name="outError"/>
   </html:messages>

============================================================================

ApplicationResources.properties配置文件:

messages.header=<h2><font color="red">
messages.footer=</font></h2>
messages.username.required=ActionMessage:the name is null

errors.header=<h2><font color="blue">
errors.footer=</font></h2>
errors.username.required=ActionError:the name is null


posted @ 2011-09-29 11:59 GavinMiao 阅读(1210) | 评论 (0)编辑 收藏

异常积累:java.lang.IllegalArgumentException

ERROR - Error:
java.lang.IllegalArgumentException: Invalid property name 'userInfoContext'
at org.apache.struts.action.DynaActionForm.getDynaProperty(DynaActionForm.java:
603)
---》错误行:UserInfoContext userInfoContext = (UserInfoContext) domainForm.get("userInfoContext");
原因:struts.xml中有两个UserInfoContext类,引用错误。
参考文章:http://hi.baidu.com/9prior/blog/item/9cabe7fba2cc9e1f6c22eb6c.html
这种异常也有可能是:actionform中的某个属性在form-bean的form-property没有配置。

posted @ 2011-09-28 15:18 GavinMiao 阅读(492) | 评论 (0)编辑 收藏

fmt:message与fmt:fmt:setBundle

参考文章:

http://cainwise.iteye.com/blog/369836

 
<fmt:message
> 
标签属性和说明 

 

 

属性
描述
key
资源配置文件的指定
bundle
若使用 <fmt:setBundle> 保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找
var
将显示信息保存为一个变量
scope
变量的作用范围

 

<fmt:bundle>  <fmt:setBundle> 标签属性和说明 

 

 

属性
描述
basename
资源配置文件的指定,只需要指定文件名而无须扩展名,二组标签共有的属性
var
 <fmt:setBundle> 独有的属性,用于保存资源配置文件为一个变量
scope
 变量的作用范围

 

eg1:
  1. <body>  
  2.   <%request.setAttribute("language","zh_CN"); %>//这里可以从客户端选择的语言那里获取  
  3.     <fmt:setLocale value="${language}"/>//这里是设置显示页面的语言  
  4.     <fmt:setBundle basename="message" var="messages"/>//这里是获取到国际化文件  
  5.         <fmt:bundle basename="message">  
  6.             <fmt:message key="com.name"/>//获取key第一种方式  
  7.             <br>  
  8.             <fmt:message key="com.name" bundle="${messages}"></fmt:message>//获取key第二种方式  
  9.         </fmt:bundle>  
  10.   </body>  
















posted @ 2011-09-28 14:08 GavinMiao 阅读(5045) | 评论 (0)编辑 收藏

用命令打开windows常用软件

mspaint 画图板 
mstsc 远程桌面连接
notepad 打开记事本
winmsd.exe 查看系统信息
Sndvol32 音量控制程序
diskmgmt.msc 磁盘管理器
cleanmgr 垃圾整理
conf 启动netmeeting聊天工具
cleanmgr.exe 磁盘清理 
calc.exe 计算器
regedt32 注册表编辑器

posted @ 2011-09-28 09:40 GavinMiao 阅读(284) | 评论 (0)编辑 收藏

电脑使用技巧:windows自带定时关机

转载:http://bbs.yhcgo.com/read.php?tid-77128.html

1.Windows XP的定时关机命令是由Shutdown.exe程序来控制的,位于Windows\System32文件夹中。
如果想让Windows 2000也实现同样的效果,可以把Shutdown.exe复制到系统目录下。

系统根目录:C:\windows\下;
2.winows+r打开“运行”输入框,然后输入以下命令:
at 22:00 Shutdown -s           --->无倒计时框,到
22:00点提示关机
shutdown.exe -s -t 3600 -->60分钟后,以
倒计时的方式关机
Shutdown -s -t 1320 -->
指定系统在22分钟后自动关闭
3.
如果想取消的话,可以在运行中输入“shutdown -a”。另外输入“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。 
4.
Shutdown.exe的参数:
-r:关机并重启
-t 时间:设置关机倒计时
“-s”就表示关闭本地计算机
“-a”表示取消关机操作
-i:显示图形用户界面,但必须是Shutdown的第一个选项

posted @ 2011-09-28 09:16 GavinMiao 阅读(530) | 评论 (0)编辑 收藏

J2EE学习网址积累

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2011-09-27 16:29 GavinMiao 阅读(94) | 评论 (0)编辑 收藏

仅列出标题
共14页: First 上一页 3 4 5 6 7 8 9 10 11 下一页 Last