2011-08-16 163 views
0

我从一本书阅读代码,并且此方法:为什么方法返回-1?

public int getScore(String name) { 
    try { 
    //some code here 
    return score; 
    } catch (Exception e) { 
    e.printStackTrace(); 
    return -1; 
    } 
} 

为什么这种方法捕获返回-1?为什么不是5?那是一个约定吗?

+2

我没有编程该方法,我怎么知道? – Marcelo

+0

这是一切都很好,直到有人将它用于高尔夫。例外情况优于每次“幻数”的返回值。 – corsiKa

+0

@Marcelo,没关系,如果你没有使用progaram方法,但你仍然可以回答我的问题。我问这是否是一些约定? –

回答

2

您是第一个选择是什么你想返回,因为你是唯一知道如何处理返回值的人。当我想要检测错误时,我也亲自使用-1,并且我知道很多人都这样做。

11

-1是一个标准的错误代码时,主叫方希望积极INT

但实际上在这种情况下,一个包裹RuntimeException或更具体的一个会是更好的

+0

我想这是一本初学者书,我知道我不会喜欢当我开始时抛出我的脸上的RuntimeException :) – talnicolas

+0

@talnicolas,它的书[链接](http://www.amazon.com/JavaSpaces-Principles -Patterns-Practice-Freeman/dp/0201309556/ref = sr_1_1?ie = UTF8&qid = 1313533710&sr = 8-1) –

+0

@talnicolas你不会喜欢的,但如果你有的话它会更好。通过你的答案来判断,你提出的幻数超越了例外,你需要一本更好的书。那本书对初学者来说很难。它适用于分布式服务器状态和算法框架Javaspaces。 – corsiKa

4

我假设笔者使用这个代码,以确保东西被退回,和getScore调用者可以检查,看是否有score正确调用。

在代码:

int theScore = getScore("My Name"); 

if(theScore == -1) { 
    // Oh no, there was an error! 
} 

我们可以使用-1的检查,以确保代码知道什么时候getScore失败。

2

他们选择-1而不是5的原因是因为-1不是从getScore方法返回的可行分数。因此,当你调用函数时,你可以很容易地检查它是否返回-1。

如果它是一个可以实际返回-1以成功运行的函数,那么-1将是旗标指示符的糟糕选择。那么更合适的选择可能是-9999或者是荒谬的。

2

第一个问题是我们不知道例外是什么。捕捉每一个例外是一个非常糟糕的决定。这些例外情况是出于某种原因而抛出的,所以您应该确切地知道出了什么问题,并且可以适当地处理它。

坏:

public int getScore(String name) { 
    try { 
    int score = scores.getScoreForName(name); 
    return score; 
    } catch (Exception e) { // catches everything 
    e.printStackTrace(); 
    return -1; 
    } 
} 

略好...

public int getScore(String name) { 
    try { 
    int score = scores.getScoreForName(name); 
    return score; 
    } catch(NameNotFoundException) { 
    e.printStackTrace(); 
    return -2; // now we know what happened, not just a general error 
    } catch (Exception e) { // catches everything 
    e.printStackTrace(); 
    return -1; // generally error 
    } 
} 

好多了:

/** 
* Get the score for a given name. Will throw a runtime exception if the 
* name doesn't exist. 
* @param name The name to get the score for 
* @return the score for the name 
* @throws NameNotFoundException if the name doesn't exist in the database. 
*/ 
public int getScore(String name) { 
    return scores.getScoreForName(name); 
} 
3

为什么该方法返回-1?

因为它的设计很差,所以在的任何例外。该方法本来可以通过宣布它抛出所有感兴趣的异常而更好地设计,特别是通过而不是捕获所有RuntimeExceptions