2016-04-14 45 views
-3

我有2个例子:差异然后在Java中

void terminate(String x) { 
    System.exit(0); 
} 

void x (long y) { 
if(y == null) { 
    terminate(); 
} 
//code 
} 
..... 
x(null); //Don't want that 

这个例子似乎工作。我想确保long y不是null。我可能会这样做:

void x (long y) throws NullPointerException { 
//code 
} 
... 
try { 
x(null); 
} catch (NullPointerException e) { 
e.printstacktrace(); 
} 

性能差异是什么?在这样的例子中,它可能不可见,但在一个复杂的程序中,它会起作用吗?我是否应该实践异常而不是如果呢?

+5

'long'不能为'null'。 – rgettman

+3

请勿使用'System.exit' – SLaks

+2

实际上,您的代码已经可以保护您免受'null'! “长”不能为空。 – eckes

回答

2

使用例外例外的情况下,当事情发生,你不期望和没有什么明智的可以做到恢复。

否则,请使用if-then并可能返回状态码。

就性能而言,异常会产生比回报更大的开销。调用一个方法并捕获一个异常,如果它不起作用是冗长而烦人的。

void myOperation() { 
    step1(); 
    step2(); 
    step3(); 
} 

在这个例子中,例外的是优选的,当任何步骤失败,则整个操作反正失败,所以我不想不必处理的任何现象。

void myOperation(String number) { 
    int n; 
    try { 
     n = Integer.parse(number); 
    } catch (NumberFormatException e) { 
     n = DEFAULT; 
    } 
    doThings(n); 
} 

在这种情况下,必须捕捉异常是烦人的,因为我期望字符串是无效的,并有一个合理的选择。异常使代码变得缓慢而冗长。

+0

我非常不同意检查异常是必须的。必须检查每个返回以查看它是否为空是更糟糕的。我宁愿一个方法抛出一个异常,而不是返回一个空对象。代码是,恕我直言,更容易阅读,没有一堆'if(obj == null){//保留无论如何}'结构。 – KevinO

+0

@KevinO我添加了一个清晰的例子。 – Cephalopod

0

表现差异是什么?

具有例外的版本肯定会工作得更慢,并且会有处理异常,创建对象,填充堆栈跟踪等的开销。

在这样的例子中,它可能不可见,但在一个复杂的程序中, 会很重要吗?我是否应该实践异常而不是如果呢?

在复杂的程序没有使用这种处理可能的空指针异常,它实际上是一个Java反模式,所以如果你whant是保存NULL,则应你有种不为null检查一样,如果(X! = null)或断言。

另外我建议你阅读更多关于java中的异常和checked/unchecked exceptions之间的区别等等。

PS here是关于空检查的好主题。