我有一个不幸的Java库,我继承了它解析JSON.现在,如果你要求一个JSON数组中不存在的密钥,它会以空指针消亡.我要编辑库来做更合理的事情.我想我有两个选择:
1)返回null,以便调用者可以检查
2)抛出更明确的异常(比"Null Pointer"更具描述性),强制调用者处理他们要求不存在的密钥的情况.
我来自python背景,我被强烈吸引到2号,因为它将确保某些骨头不能调用此函数,然后继续使用空值,稍后崩溃其应用程序并可能损坏数据.您认为哪种方式更符合Java的最佳实践?这不是关于同一主题的其他与语言无关的问题的重复.这特别是在Java的背景下!
例如,如果我有这个方法:
IEnumerable<int> GetRandomNumbers()
{
// {Codes that generate numbers as List<int>}
if(generationFails == true)
{
return Enumberable.Empty<int>(); // I do this to signal that we have an error
}
return numbers;
}
Run Code Online (Sandbox Code Playgroud)
在调用方法中我做:
IEnumerable<int> AddNumber(int number)
{
var random = GetRandomNumbers();
var randomList = random as IList<int> ?? random.ToList(); // Run ToList only if needed
randomList.Add(number);
return randomList;
}
Run Code Online (Sandbox Code Playgroud)
当生成失败时,我得到一个异常"[NotSupportedException:Collection是固定大小的.]".
这是因为Enumerable empty是一个IList,因此.ToList()没有运行,然后我尝试添加到一个固定的Enumberable.Empty.我错误地认为这是一个糟糕的设计,一个继承IList的对象(其中定义了Add)应该支持Add?
我被迫做var randomList = random.ToList()或停止使用Enumberable.Empty?有更好的方法吗?
更新: 我想在我的例子中我不清楚.我希望吞下(或记录)错误,但允许操作继续而不会崩溃.我的评论"我这样做是为了表明我们有错误"是为了告诉其他开发人员阅读代码,这是一种异常行为.
蒂姆所关联的问题的答案就是我所得到的.似乎我们只是没有用于常量集合的接口,因此IList被使用.
我来自C世界,在那里我们使用"define"来定义不同的返回值,从C函数返回的值,如下所示:
#define RETURN_SUCCESS 0
#define RETURN_ERROR -1
int myFunc()
{
if(...) return(RETURN_SUCCESS);
else if(...) return(RETURN_ERROR);
}
Run Code Online (Sandbox Code Playgroud)
这是如何在Java中以正确的方式完成的?
假设我有:
public MyObject findMyObject()
{
MyObject tempObject = search();
if( tempObject.type == myType )
{
return tempObject;
}
else
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
可以回来null吗?
有没有更合适的方法呢?
public class StringArray {
private String strArr[];
public StringArray(int capacity) {
strArr = new String [capacity];
}
public int indexOf(String s) throws StringNotFoundException {
for(int i=0;i<strArr.length ;++i) {
if (strArr[i].equals(s)) {
return i;
} else {
throw new StringNotFoundException();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是返回我正在寻找的字符串的索引,如果它在数组中,否则抛出异常.
然而Eclipse说我必须返回一个int.
那么我应该将返回类型更改为void还是有其他选项?
StringNotFoundException是我编写的自定义异常.