由InvocationTargetException引发的思考 (转载)

 最近接到的项目,终于过了第一轮,兴奋之余还是要静下心来好好研究代码。第二轮得分只有60分,意料之中,做的时候就发现有很多不会的了,当时及时记录下来,所以这次看代码也有针对性的多。

      逻辑代码最大的问题还是出在异常处理上,有很多不合适的地方,不过经历过这次下次应该不会再犯了。测试依然疑问最多,很多莫名的异常不知道如何抛出,归根到底还是Java的基础不牢,不过这也不是一天两天的事情,见的多了自然熟悉。

      今天看到一个很常见的异常–InvocationTargetException,顾名思义,在反射机制中,如果当前执行的方法所调用的方法抛出异常,会被包装成这个异常,

当然这在之前我是不知道的。因为在coding的时候,一写反射的语句,IDE会自动提示需要处理这个异常,于是乎很自然而然的就写上了catch(InvocationTargetException),不需要理由。可是当编写单元测试的时候问题就来了,你需要构造一套参数,让函数抛出这个异常以验证代码可以捕获这个异常。

      最一开始是从研究Winner的代码开始的,看到Winner写的对应的测试,很是摸不着头脑,不知道Winner的参数为何可以导致异常,上网查资料,除了API只外几乎没有任何资料,API中对于这个异常又描述甚少。手头的各种Java工具书这时候也派不上用场了。无计可施,只好请教学长。其实这个问题大家平时都遇到过,因为反射是TC上最常用到的技术之一,可能是因为太不显眼,所以大家之前都不约而同的无视它了。现在提出来,于是我们一起摸索。

     摸索的过程也是我学习的过程,很多思想我慢慢树立起来。构造异常测试,首先看配置文件,因为参数的不合法是导致异常的最常见原因。总之要充分利用项目文档所提供给我们的信息,这可以极大的提高开发的效率和质量。毕竟很多问题已经不需要我们去思考了,designer已经为我们考虑到,我们只需要照做。对于如此短的项目周期来说,这一点很重要。

     这个异常是反射机制定义的异常,自然在开发文档中找不到了。接下来我们还是走了小小的弯路,我们找来了JDK的源码……各种复杂的关系和调用,最终崩溃。放弃……不过我还是学了一小招。参考源码确实能解决很多问题,但是这在简单的类中比较实用。比如说String这样的类,里面的诸如substring ,spilt等方法可以给我们提供算法的灵感。

     学习Java最直接的工具还是API文档了。我无意间查到了抛出这个异常的newInstance方法,下面明确写着,当新建对象的类构造方法在被调用时抛出异常,此异常将被抛出。问题解决了:测试者提供的给构造方法的参数有两个,而此类构造方法只接受一个参数,于是乎异常被抛出。

     最终的答案是简单的,但是要是在项目开发中意识到这个问题难度还是很大的,需要有对项目足够的理解再加上足够的开发经验才能做到。对项目整体功能的把握和对每个细节精确的理解,是我所发现的最大差距所在,也将是我近期努力的目标。毕竟所掌握的技术和各种编码技巧不是一个技术人员价值的最大体现。严谨的思维和对细节的把握才是技术人员身上的闪光点,这是无可替代的。


启动TOMCAT报‘APR not found’

启动tomcat服务器时报
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.6.0_29\bin;….” 直译就是 ”基于TOMCAT本地库的APR在windows环境变量bin path 中尚未找到”,登录 apache tomcat 官方主页发现,运行tomcat 需要安装 Apache Portable Runtime (APR),以提高tomcat服务器运行效率,具体见 http://tomcat.apache.org/tomcat-6.0-doc/apr.html ,apr 的安装很简便,只要将 tcnative-1.dll 动态库文件放到 jdk和tomcat 的bin 目录下即可。


INSERT EXEC PROC不能嵌套的解决方法

存储过程A返回一个结果集,存储过程B用INSERT/EXEC PROC将A返回的结果集存入一个临时表中并返回一个结果集,如果存储过程C用INSERT/EXEC PROC再将B的结果集存入一个临时表,这时会报错:An INSERT EXEC statement cannot be nested(INSERT EXEC 语句不能嵌套).

先建一个连接到自身数据库的连接服务器并开启该连接服务器的RPC功能,包含RPC和RPC输出项,如下两种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---A.建一个连接到自身数据库的连接服务器
---开启该连接服务器的RPC功能,右击该连接服务器,单击属性,单击服务器选项,然后选中RPC和RPC输出项即可
EXEC sp_addlinkedserver 
 @server  = 'self', 
 @srvproduct  = '', 
 @provider  = 'MSDASQL',
 @datasrc  = NULL,
 @location  = NULL,
 @provstr  = 'DRIVER={SQL Server};Server=(local);Initial Catalog=master;uid=sa;pwd=123;'
 
---B.创建链接服务器
exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','远程服务器名或ip地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用户名','密码'
exec sp_serveroption 'srv_lnk','rpc','true'
exec sp_serveroption 'srv_lnk','rpc out','true'  --这个允许调用链接服务器上的存储过程
 
---用SQL命令建立与本Server的Linked Server.
Exec   sp_addlinkedserver     '172.26.40.8','','SQLOLEDB','172.26.40.8'   
Exec   sp_addlinkedsrvlogin   '172.26.40.8','false',null,'sa','123'   
exec sp_serveroption '172.26.40.8','rpc','true'
exec sp_serveroption '172.26.40.8','rpc out','true'  --这个允许调用链接服务器上的存储过程

调用示例如下,

1
2
3
4
5
Create Table #TempCheckResult(iResult varchar(12),iMessage nvarchar(200))
Declare @iSQL nvarchar(200)
Set @iSQL= 'Exec usp_PAL_CheckCompUsability '+'''SW89080571GN'''+',''W8905001U632A'''+',''Repair'''
Insert Into #TempCheckResult EXEC(@iSQL) ---此句会报错:An INSERT EXEC statement cannot be nested.
Insert Into #TempCheckResult EXEC [172.26.40.6].PAL_COMPSN_P80.dbo.sp_executesql @iSQL ---@iSQL --须为nvarchar,varchar会报错

sqlserver中判断表是否存在

在sqlserver(应该说在目前所有数据库产品)中创建一个资源如表,视图,存储过程中都要判断与创建的资源是否已经存在
在sqlserver中一般可通过查询sys.objects系统表来得知结果,不过可以有更方便的方法
如下:
   

1
2
3
4
 if   object_id('tb_table') is not null 
        print 'exist'
    else
        print'not exist'

如上,可用object_id()来快速达到相同的目的,tb_table就是我将要创建的资源的名称,所以要先判断当前数据库中不存在相同的资源
object_id()可接受两个参数,第一个如上所示,代表资源的名称,上面的就是表的名字,但往往我们要说明我们所要创建的是什么类型的资源,
这样sql可以明确地在一种类型的资源中查找是否有重复的名字,如下:
   

1
2
3
4
 if   object_id('tb_table','u') is not null 
        print 'exist'
    else
        print'not exist'

第二个参数 “u” 就表示tb_table是用户创建的表,即:USER_TABLE地首字母简写
查询sys.objects中可得到各种资源的类型名称(TYPE列),这里之举几个主要的例子
u  ———–  用户创建的表,区别于系统表(USER_TABLE)
s  ———–  系统表(SYSTEM_TABLE)
v  ———–  视图(VIEW)
p  ———–  存储过程(SQL_STORED_PROCEDURE)
可使用select distinct type ,type_desc from sys.objects 获得全部信息


世界,你好!

欢迎使用 WordPress。这是系统自动生成的演示文章。编辑或者删除它,然后开始您的博客!


Copyright © 1996-2010 阿健. All rights reserved.
iDream theme by Templates Next | Powered by WordPress