目前我正在进行代码优化,我正在使用try .. finally块来尊重我的对象.
但我感到困惑的是,当我在finally块中创建对象的空引用时,如何管理返回对象.??
在try块中返回一个对象时,它会在编译期间创建一个预编译的语句吗?或者在返回语句时在堆中创建新引用?或者只返回对象的当前引用?
以下是我的研究代码.
public class testingFinally{
public static String getMessage(){
String str = "";
try{
str = "Hello world";
System.out.println("Inside Try Block");
System.out.println("Hash code of str : "+str.hashCode());
return str;
}
finally {
System.out.println("in finally block before");
str = null;
System.out.println("in finally block after");
}
}
public static void main(String a[]){
String message = getMessage();
System.out.println("Message : "+message);
System.out.println("Hash code of message : "+message.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
在最后块中
的str:-832992604
的最后块中的try块阻塞哈希代码 消息:Hello world 哈希消息代码:-832992604
当我看到返回对象和调用对象具有相同的哈希码时,我感到非常惊讶.所以我对对象引用感到困惑.
请帮我清楚这个根本.
我在下面的代码中观察到了scanf()的一些奇怪行为:
#include<stdio.h>
int main(void)
{
int n;
scanf("\n%d",&n); // 1 scanf
printf("N is entered=%d",n);
printf("\nAfter n being displayed\n");
scanf("%d\n",&n); // 2 scanf
prinf("n entered again =%d",n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑是第二种行为scanf().第一种scanf()是将光标移动到下一行然后接受输入,而在第二行scanf()接受输入,将光标移动到下一行然后等待直到我输入另一个整数.
为什么它会提示我在下一行输入另一个整数,而不是显示在下一行中输入的消息n,即使它采用正确的n值?以下是输出:
2
N is entered=2
After n being displayed
45
543
n entered again=45
Run Code Online (Sandbox Code Playgroud) 我已上传该对象并将其在我的存储桶下标记为公共。当我单击时,Object URL我可以在浏览器上看到它(可公开访问)。
然后我在 s3 存储桶级别启用了版本控制,然后更改了对象中的内容并将其再次上传到同一存储桶。版本控制效果很好,我可以看到同一对象的两个不同版本。然而,公共访问则不然。当我点击新的时Object's URL,它说访问被拒绝。
这种行为背后有什么具体原因,或者这是 S3 的已知问题,或者我正在做一些不符合标准做法的事情?