奇怪的警告值“x”始终为“null”

muk1a3rh  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(307)

此问题已在此处找到答案

在java中运行构造函数代码之前是否初始化字段((五个答案)
java值总是空的[(1份答覆)
四天前关门。
下面的代码返回一个错误,它无法连接到sqlite数据库。

public class CardDatabase {

    private String dataBaseName;

    public CardDatabase(String dataBaseName) {
        this.dataBaseName = dataBaseName;
    }

    String databaseUrl = "jdbc:sqlite:./" + dataBaseName; // Value 'dataBaseName' is always 'null' 
    SQLiteDataSource dataSource = new SQLiteDataSource();

尽管下面的代码非常有效。

public class CardDatabase {

    private String dataBaseName;

    public CardDatabase(String dataBaseName) {
        this.dataBaseName = dataBaseName;
    }

    SQLiteDataSource dataSource = new SQLiteDataSource();
    String databaseUrl = "jdbc:sqlite:./" + dataBaseName; // swaped two lines

你能帮我了解这两个代码之间的区别吗?为什么第一个代码不能编译?

vpfxa7rd

vpfxa7rd1#

String databaseUrl = "jdbc:sqlite:./" + dataBaseName; 在执行构造函数之前初始化。
意味着它将始终使用 null 因为 dataBaseName 尚未初始化。
但是您可以将初始化移到构造函数中。最好将字段放在构造函数之前,如果您从未重新分配它们,则可以将其设置为 final ,表示无法覆盖:

public class CardDatabase {

    private final SQLiteDataSource dataSource = new SQLiteDataSource();
    private final String dataBaseName;
    private final String databaseUrl;

    public CardDatabase(String dataBaseName) {
        this.dataBaseName = dataBaseName;
        this.databaseUrl = "jdbc:sqlite:./" + dataBaseName;
    }
}

关于您收到的错误:可能只是您的ide没有充分地分析您的代码,它可以检查这一点 dataBaseName 还是 null 排队后 SQLiteDataSource dataSource = new SQLiteDataSource();

相关问题