我正在开发的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
答案 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);
}