我有一种感觉,答案是"不",但我想我应该问一下,以防万一。
伪代码:
Foo foo = new Foo();
if(foo != null){
foo.useMe();
}else{
System.out.println("foo failed to initialize");
}
我要在Foo中做什么才能使这成为现实?
不,没有办法让一个新对象是null
。当然,这是假设构造函数中没有错误,但如果有,那么无论如何都不能使用该变量。
关于类实例创建表达式的更多信息,我推荐使用语言规范
对于这种情况,通常只需让它抛出一个异常。您可以很容易地编写自己的异常,或者只是使用throw new Exception("foo failed to initialize");
之类的东西并捕获它。
编写自己的Exception: http://www.javaplex.com/blog/java-creating-custom-exceptions/
不,构造函数没有返回值,但无论何时使用"new",都可以创建一个对象的引用。我觉得你想要的是:
class Factory
{
static MyClass getMyClass()
{
if(true or false expression)
return new MyClass();
else if(true or false expression)
return null;
}
}
然后你可以这样创建你的类
MyClass bla = Factory.getMyClass();
if(null)
do something
我知道这不可能;但出于好奇,我试了一段代码。
public class Test {
public Test () {
this = null;
}
}
当然编译失败了,因为"this"是final
不,这不可能。按照约定,如果对象初始化失败,则抛出异常。
不,这是不可能的——你可以在构造函数中抛出一个检查异常,如果你真的想要这种类型的行为,它需要在另一端被捕获。
在处理构造函数中的错误方面,不久前一篇Java专家时事通讯研究了这个主题。可能值得一读:http://www.javaspecialists.eu/archive/Issue120.html
不,构造函数不可能返回null。如果在创建对象时出现问题,则构造函数应该抛出异常。
以FileInputStream
课程为例。这个类用于从文件中读取数据。如果将不存在的文件传递给构造函数,则会抛出FileNotFoundException
:
try{
FileInputStream in = new FileInputStream("file.txt");
} catch (FileNotFoundException e){
System.out.println("File 'file.txt' doesn't exist.");
}
必须是构造函数吗?如果这确实是您所需要的,为什么不使用一个可以返回Foo或null的新实例的函数呢?
11年过去了,我们仍然有这个问题。要总结有效的回答并添加一个想法:
想法1:创建一个像工厂一样工作的包装器类。如果数据有效,这个包装器类将创建内部类的新实例。(通过user975484)//如果你是一个人工作,想法1是很好的,但如果你是为学校或公司项目创建一个对象,那么你可能不允许使用工厂。
想法2:如果构造函数中的数据无效,抛出异常。(通过CamelSlack)//如果用户捕获并处理错误,Idea 2也很棒。然而,由于学校或公司的规定,你可能不允许使用这种方法。我相信,如果你能使用它,这可能是最好的解决方案。
想法3:验证数据后返回对象中函数的null或默认数据。本质上,在运行函数之前运行数据验证。//对于那些被迫遵守一套过于严格的要求的学生和雇员来说,想法3可能是唯一的选择。除非想法1和2不能使用,否则真的没有用。