相关疑难解决方法(0)

避免!= null语句

我用object != null了很多东西来避免NullPointerException.

有没有一个很好的替代品呢?

例如:

if (someobject != null) {
    someobject.doCalc();
}
Run Code Online (Sandbox Code Playgroud)

NullPointerException当不知道对象是否存在时,这避免了a null.

请注意,接受的答案可能已过期,请参阅/sf/answers/167020941/以获取更新的方法.

java null object nullpointerexception

3904
推荐指数
42
解决办法
119万
查看次数

在java中尝试/ catch vs null检查

有时我面对我必须写一段这样的代码(通常它有更多的嵌套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)

第二种形式如性能或其他类型的问题是否有问题?

谢谢

java

32
推荐指数
4
解决办法
2万
查看次数

Java Try/Catch Block的基准测试

我知道进入一个catch块在执行一个程序时有一些显着的成本,但是,我想知道是否进入try {}块也有任何影响因此我开始在google中寻找一个有很多意见的答案,但没有基准测试所有.我发现的一些答案是:

  1. Java try/catch性能,是否建议将try子句中的内容保持在最低限度?
  2. 尝试Catch Performance Java
  3. Java尝试捕获块

然而他们并没有用事实回答我的问题,所以我决定自己尝试一下.

这就是我做的.我有一个这种格式的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)

有人能解释一下这里发生了什么吗?

非常感谢

java try-catch

8
推荐指数
1
解决办法
1169
查看次数

如何更好的重构方法链可以在java中返回null?

我的代码如下:

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步.它似乎非常脆弱且容易出错.有没有更好的方法来检查空链方法?

谢谢.

java methods null refactoring chain

8
推荐指数
3
解决办法
3073
查看次数

当99%的时间对象不为空时,空检查与try/catch

通常我更喜欢空检查.但在目前的情况下,我知道大部分时间我的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

8
推荐指数
1
解决办法
1185
查看次数

使用ObjectInputStream读取文件时出现EOFException

我基本上遇到了类似的问题: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)

java

4
推荐指数
3
解决办法
3万
查看次数