在Java中是否有一种方法可以让构造函数返回一个== null的对象?



我有一种感觉,答案是"不",但我想我应该问一下,以防万一。

伪代码:

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不能使用,否则真的没有用。

最新更新