2010-07-27 64 views
6

说如果我有下面的代码,它基本上确定某些条件匹配,然后分配布尔值,然后运行一些代码。然后抛出一个异常,如果booleanValue为false。如果我想要它立即抛出异常,如果booleanValue为false而不运行其余代码?如果我只是将第二个条件语句放入第一个条件语句中,则会有重复的代码。请给我一个聪明的方法来做到这一点(我修改了代码,看起来像我的实际代码)。在Java中重写条件语句

boolean booleanValue = false; 
Permission value; 

if (someCondition) { 
    value = getPermission_1(); 
    booleanValue = someMethod(value); 
    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 
    booleanValue = anotherMethod(value); 

    useValue_2(value); 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

回答

7

如何消除布尔变量?你可以重写你这样的代码:

if (someCondition) { 
    if (!someMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 
else { 
    if (!anotherMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 

这看起来容易我的眼睛,但这样的事情是口味的问题......

额外的好处:如果该异常的堆栈跟踪结束你知道条件是什么,因为你有两个不同的投掷陈述。这可能会加快调试的速度。

+0

我喜欢这个,因为它看起来简单明了。 – newguy 2010-07-27 02:57:31

4

而不是

booleanValue = anotherMethod(); 

您只需编写

if(!someMethod()) 
    throw new SomeException(); 

在抛出一般异常 - 不。抛出异常的原因是告诉调用者发生了一些特殊事件。告诉他们什么是几乎总是有用的,否则呼叫者和你都无法对此做任何事情。

+0

你是对的,但我问的是另一个问题,这就是为什么我没有提出特别的名字。 – newguy 2010-07-27 01:54:19

+1

只是指出它会是(!someMethod())保留原始代码 – MadMurf 2010-07-27 01:54:33

+0

实际上问题比这更复杂,请看看我的修改后的代码。 – newguy 2010-07-27 02:04:10

2

假设这两种some codes...是不同的,你可能想要做的:

boolean booleanValue = someCondition ? someMethod() : anotherMethod(); 
if(!booleanValue) { 
    throw new Exception(); 
} 

if(someCondition) { 
    // some code 
} else { 
    // some code 
} 

如果它们是相同的if(someCondition)是没有必要的


如果(假设)你有静态分析工具,不允许使用三元表达式,可以用以下代替第一行:

boolean booleanValue; 
if(someCondition) { 
    booleanValue = someMethod(); 
} else { 
    booleanValue = anotherMethod(); 
} 
+0

这对我来说是不好的代码风格。会在checkStyle阶段失败。 – newguy 2010-07-27 01:46:48

+2

@newguy那么,你将不得不定义你的好代码风格是什么;我对该代码没有任何问题 – 2010-07-27 01:48:46

+0

我的项目使用的检查风格插件不允许像第一行那样的任何代码,所以我必须遵守该规则。 – newguy 2010-07-27 01:52:37

1

显而易见的解决方案是:

boolean booleanValue = false; 

if (someCondition) { 
    booleanValue = someMethod(); 
    if(booleanValue){ 
     //some codes... 
    } 
} 
else { 
    booleanValue = anotherMethod(); 
    some codes... 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

...但我不介意重复if(!booleanValue) throw Exception();位,因为这很可能是你扔了异常的概念上不同的原因。 (例如,您可以在例外情况中提供更好的错误消息。)

+0

这不是解决方案。我想要的是在分配booleanValue后立即抛出异常,因为我不想让其余的代码运行。 – newguy 2010-07-27 01:48:36

+0

@newguy:请再看一遍。这就是它的作用。虽然有点不清楚我的口味。我更喜欢Joel和Nils给出的答案。 – 2010-07-27 01:57:17

+0

@newguy:这个解决方案的确给了你所要求的。就我个人而言,我不喜欢这种风格,但它可能是编辑差异最小的解决方案。 – Akusete 2010-07-27 02:00:14

1

它的一切都很主观,也许?

boolean booleanValue = aBoolean; 
if (someCondition) { 
    if (!someMethod()) { 
     throw new SomeException(); 
    } 
    some codes... 
} else { 
    if (!anotherMethod()) { 
    throw new AnotherException(); 
    } 
    some other codes... 
} 
1

你最好的解决办法是......

if (someCondition) { 
    value = getPermission_1(); 

    if (!someMethod(value)) { 
    throw new SomeException(); 
    } 

    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 

    if (!anotherMethod(value)) { 
    throw new AnotherException(); 
    } 

    useValue_2(value); 
} 

,你不应该在它看起来像复制代码,因为如果你想抛出一个异常,那么预期是,对于原因每种情况下的例外情况都会有所不同,因此应该在每种情况下传递不同的例外或不同的消息。

我假设你想知道哪个条件被执行,并随后失败,因为你所得到的是从你的布尔值...方法调用失败的原因可能不会在这个明显的场景。

0

这种有味道......就像“代码味道”一样。返回值正被转换为异常。看起来,如果调用者编写了一些方法和另一种方法,那么解决方案是重写这些方法并从这些方法抛出异常,而不是使用返回值。但是,只有程序员可以访问代码才行。如果这是第三方API调用,我想翻译可能不得不发生。