虽然变量已初始化但我可能没有初始化错误

时间:2018-05-30 08:54:26

标签: java android

我正在开发的Android应用程序中遇到以下代码的问题。现在即使我初始化了变量,我得到的错误变量可能还没有被初始化。

Activity context;
context = new Activity();
SimpleSpkDetSystem alizeSystem;
try {
    InputStream configAsset = context.getApplicationContext().getAssets().open("MyConfig.cfg");
    try {
        alizeSystem = new SimpleSpkDetSystem(configAsset, context.getApplicationContext().getFilesDir().getPath());
    } catch (AlizeException e) {
        Log.e(LOG_TAG, "File not found for recording ", e);
    }
    configAsset.close();

} catch (java.io.IOException e) {
    Log.e(LOG_TAG, "File not found for recording ", e);
}
InputStream backgroundModelAsset;
try {
    backgroundModelAsset = context.getApplicationContext().getAssets().open("gmm/world.gmm");
} catch (java.io.IOException e) {
    Log.e(LOG_TAG, "File not found for recording ", e);
}
try {
    alizeSystem.loadBackgroundModel(backgroundModelAsset);
} catch (AlizeException e) {
    Log.e(LOG_TAG, "File not found for recording ", e);
}
try {
    backgroundModelAsset.close();
} catch (java.io.IOException e) {
    Log.e(LOG_TAG, "File not found for recording ", e);
}

以下是我得到的错误

Error:(274, 13) error: variable alizeSystem might not have been initialized
Error:(274, 45) error: variable backgroundModelAsset might not have been initialized
Error:(279, 9) error: variable backgroundModelAsset might not have been initialized
Error:(274, 44) error: unreported exception IOException; must be caught or declared to be thrown

5 个答案:

答案 0 :(得分:3)

  

现在即使我已经初始化了变量

你没有 - 不一定。假设new SimpleSpkDetSystem(...)调用抛出AlizeException。您正在捕获该异常并继续 - 但您不会为alizeSystem分配值。所有其他变量也是如此。

我怀疑这里的解决方案 not 只是记录异常然后继续,好像它们没有发生,而是让它们冒泡到调用者。

答案 1 :(得分:2)

因为您正在try catch块中初始化变量

使用以下内容: -

SimpleSpkDetSystem alizeSystem = null;

每当您声明它们时,以与某些值相似的方式初始化每个变量,特别是那些正在初始化或在某些try catch或if块中创建的变量。

答案 2 :(得分:2)

变量未初始化,因为错误正确陈述。

在您的代码中,您有:

SimpleSpkDetSystem alizeSystem;

这意味着您没有初始化变量alizeSystem。然后为它分配一个值,但在try / catch块中:如果抛出某个异常,则不会初始化该变量。 最后,你执行此操作:

alizeSystem.loadBackgroundModel(backgroundModelAsset);

但是如果第一个try / catch块捕获到异常,则不会初始化alizeSystem。因此,您只需在定义它时将其初始化为null:

SimpleSpkDetSystem alizeSystem = null;

并在使用时检查空值:

if(alizeSystem!=null)
    alizeSystem.loadBackgroundModel(backgroundModelAsset);

所有其他单元化变量

也是如此

答案 3 :(得分:0)

您需要为这些变量提供值,因为在执行期间,即使抛出excepton,程序也会继续运行。在您的情况下,我认为您需要在记录错误

后停止执行此代码块

答案 4 :(得分:0)

你应该尝试:

    SimpleSpkDetSystem alizeSystem = null;

然后

try {
     alizeSystem.loadBackgroundModel(backgroundModelAsset);
}catch (AlizeException e) {
    Log.e(LOG_TAG, "File not found for recording ", e);
}
catch (NullPointerException e) {
    Log.e(LOG_TAG, "Null alizeSystem ", e);
}