我用object != null
了很多东西来避免NullPointerException
.
有没有一个很好的替代品呢?
例如:
if (someobject != null) {
someobject.doCalc();
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException
当不知道对象是否存在时,这避免了a null
.
请注意,接受的答案可能已过期,请参阅/sf/answers/167020941/以获取更新的方法.
有时我面对我必须写一段这样的代码(通常它有更多的嵌套if和更复杂的结构,但是对于这个例子来说)
public void printIt(Object1 a){
if (a!=null){
SubObject b= a.getB();
if (b!=null){
SubObject2 c=b.getC();
if(c!=null){
c.print();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我不需要知道什么是失败的,如果什么是空的什么都不做,一种方法可能是
public void printIt(Object1 a){
try{
a.getB().getC().print();
}catch (NullPointerException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
第二种形式如性能或其他类型的问题是否有问题?
谢谢
我知道进入一个catch块在执行一个程序时有一些显着的成本,但是,我想知道是否进入try {}块也有任何影响因此我开始在google中寻找一个有很多意见的答案,但没有基准测试所有.我发现的一些答案是:
然而他们并没有用事实回答我的问题,所以我决定自己尝试一下.
这就是我做的.我有一个这种格式的csv文件:
host;ip;number;date;status;email;uid;name;lastname;promo_code;
状态之后的所有内容都是可选的,甚至没有相应的; ,所以在解析验证时必须要查看值是否存在,这就是我想到的try/catch问题.
我在公司里继承的当前代码是这样的:
StringTokenizer st=new StringTokenizer(line,";");
String host = st.nextToken();
String ip = st.nextToken();
String number = st.nextToken();
String date = st.nextToken();
String status = st.nextToken();
String email = "";
try{
email = st.nextToken();
}catch(NoSuchElementException e){
email = "";
}
Run Code Online (Sandbox Code Playgroud)
它重复了用uid,name,lastname和promo_code为电子邮件做的事情.
我改变了一切:
if(st.hasMoreTokens()){
email = st.nextToken();
}
Run Code Online (Sandbox Code Playgroud)
事实上它表现得更快.解析没有可选列的文件时.以下是平均时间:
--- Trying:122 milliseconds
--- Checking:33 milliseconds
Run Code Online (Sandbox Code Playgroud)
然而,这就是让我感到困惑的原因和我要问的原因:当在CSV的所有8000行中运行带有可选列值的示例时,if()版本仍然比try/catch版本表现更好,所以我的问题是
try块是否真的对我的代码没有任何性能影响?
此示例的平均时间为:
--- Trying:105 milliseconds
--- Checking:43 milliseconds
Run Code Online (Sandbox Code Playgroud)
有人能解释一下这里发生了什么吗?
非常感谢
我的代码如下:
obj1 = SomeObject.method1();
if (obj1 != null) {
obj2 = obj1.method2();
if (obj2 != null) {
obj3 = obj2.method3();
if (obj3 != null) {
............
return objN.methodM();
}
}
}
....
Run Code Online (Sandbox Code Playgroud)
我有近10步.它似乎非常脆弱且容易出错.有没有更好的方法来检查空链方法?
谢谢.
通常我更喜欢空检查.但在目前的情况下,我知道大部分时间我的if条件都会通过,并且很少有合法的场景,其中object可能为null.
此外,负载是巨大的(约500万次电话/小时)
现在我试图从性能角度找出哪种方式更好.已经检查过java中的try/catch vs null检查,但我的情况是唯一的.
还检查哪个更快,在java中尝试catch或if-else(WRT性能)但是这个和上面的都是在通用上下文中,其中通过/失败比率的知识不可用.
public void process(Job job) {
//... some code which processes job
SubJob subJob = job.getSubJob();
if(subJob != null) { // 99% of the time this will pass
//.. do something
}
}
Run Code Online (Sandbox Code Playgroud)
尝试/捕捉版本
public void process(Job job) {
//... some code which processes job
SubJob subJob = job.getSubJob();
try {
//.. do something
}catch(NullPointerException e) { //This may occure only 1% of the time.
//...
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
获胜者是空检查.在Try/catch中,内部JVM将执行空检查并且无论如何都会抛出NPE,并且在JVM中创建异常处理(堆栈等的创建)将是开销.另外,根据另一个答案,现代CPU足够聪明,可以通过良好的预测来处理这些情况,在我的独特案例中,这些预测总是有利于.
我还编写了程序(在我的名字下面发布),结果清楚地表明我的AMD处理器上的空检查更好. …
我基本上遇到了类似的问题:Java中的EOFexception在读取objectinputstream时,但我没有找到干净代码的答案.
答案表明,ObjectInputStream#readObject
当读者到达文件结尾时,将抛出异常.在网上寻找解决方案之后,我还没有找到解决方案.对于这种情况,这可能是一个很好的清洁解决方案
注意:我试过这个(但它看起来很难看并且不是干净的代码).我正在寻找更好的解决方案:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
try {
Object o;
while ((o = ois.readObject()) != null) {
if (o instanceof MyClass) {
MyClass m = (MyClass)o;
//use the object...
}
}
} catch (EOFException eofex) {
//do nothing
} catch (IOException ioex) {
throw ioex;
//I have another try/catch block outside to control the life of the ObjectInputStream
}
//later in the code...
ois.close();
Run Code Online (Sandbox Code Playgroud)