这是我认为的java纯粹主义者的一个.我最近遇到一个问题,一个方法来执行自定义的String值解析为布尔值.一个简单的任务,但由于某种原因,下面的方法是在null情况下抛出NullPointerException ...
static Boolean parseBoolean(String s)
{
return ("1".equals(s) ? true : ("0".equals(s) ? false : null));
}
Run Code Online (Sandbox Code Playgroud)
该方法的返回类型是布尔值,那么为什么或如何抛出NullPointerException?从调试开始,似乎异常被抛出到嵌套的内联条件语句求值为null并返回null到外部内联条件的点,但我再也无法解释原因.
最终我放弃并重写了如下方法,它按预期工作:
static Boolean parseBoolean(String s)
{
if ("1".equals(s)) return true;
if ("0".equals(s)) return false;
return null;
}
Run Code Online (Sandbox Code Playgroud)
以下代码介于两者之间,也可按预期工作:
static Boolean parseBoolean(String s)
{
if ("1".equals(s)) return true;
return "0".equals(s) ? false : null;
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个PHP扩展,其中一个对象方法需要返回一个数组zval.
该方法如下:
ZEND_METHOD(myObject, myMethod)
{
zval **myArrayProperty;
if (zend_hash_find(Z_OBJPROP_P(getThis()), "myArrayProperty", sizeof("myArrayProperty"), (void **) &myArrayProperty) == FAILURE) {
RETURN_FALSE;
}
RETURN_ZVAL(*myArrayProperty, 1, 0);
}
Run Code Online (Sandbox Code Playgroud)
代码工作正常,并做了预期的事情 - 它返回对象的myArrayProperty.但是,我想优化这个过程.
myArrayProperty存储一个可能很大的数组.并且RETURN_ZVAL()宏复制该数组以返回值.复制过程需要花费大量时间来获取内存并复制所有数组值.同时,返回的数组通常用于只读操作.所以一个很好的优化是使用PHP的机制与引用计数,不要重复myArrayProperty内容.相反我会提高refcount的myArrayProperty,只是返回指针.当使用PHP扩展中的变量时,这与通常使用的策略相同.
但是,似乎没有办法 - 你必须复制值才能从PHP扩展函数返回它.更改函数签名以通过引用返回值不是一个选项,因为它链接属性和返回值 - 即稍后更改返回值,也会更改属性.这不是一种可接受的行为.
无法参与引用计数看起来很奇怪,因为PHP中的代码相同:
function myMethod() {
{
return $this->myArrayProperty;
}
Run Code Online (Sandbox Code Playgroud)
通过引用计数机制进行优化.这就是我在StackOverflow上提出这个问题的原因,以防我错过了什么.
那么,有没有办法从PHP扩展中的函数返回一个数组,而不是在内存中复制数组?
我使用函数写一个服务器char* inet_ntoa(struct in_addr in),当我包括报头
<sys/socket.h>和<netinet/in.h>,可执行的二进制可以用编译器警告生成,但段发生故障,当程序处理从返回字符串inet_ntoa.但是当我添加标题时,<arpa/inet.h>,一切似乎都没问题.
怎么了?
我运行了一个交互式基础,以进行提交abcdef。
git rebase -i abcdef
Run Code Online (Sandbox Code Playgroud)
在编辑器-Vim中,我将所有pick hash行更改为
reword hash PREFIX: Original commit message 使用此vim命令
%s/pick \(\w\{7}\)/reword \1 PREFIX:/
但随后git继续提示我为每次提交编辑消息。有没有简单的方法来批量处理此过程?
我跑
calloc(1024*1024*1024,sizeof(int));
我查看我的程序的用法,它是零但我从未打过电话 free
编辑:
运行Debian Jessie
编辑2:
我使用top作为系统监视器