小编Nat*_*han的帖子

finalize()在Java 8中调用强可达对象

我们最近将我们的消息处理应用程序从Java 7升级到Java 8.自升级以来,我们偶尔会遇到一个流在读取时被关闭的异常.记录显示终结器线程正在调用finalize()保存流的对象(进而关闭流).

代码的基本概要如下:

MIMEWriter writer = new MIMEWriter( out );
in = new InflaterInputStream( databaseBlobInputStream );
MIMEBodyPart attachmentPart = new MIMEBodyPart( in );
writer.writePart( attachmentPart );
Run Code Online (Sandbox Code Playgroud)

MIMEWriter并且MIMEBodyPart是本土MIME/HTTP库的一部分. MIMEBodyPart扩展HTTPMessage,具有以下内容:

public void close() throws IOException
{
    if ( m_stream != null )
    {
        m_stream.close();
    }
}

protected void finalize()
{
    try
    {
        close();
    }
    catch ( final Exception ignored ) { }
}
Run Code Online (Sandbox Code Playgroud)

异常发生在调用链中MIMEWriter.writePart,如下所示:

  1. MIMEWriter.writePart() 写入部件的标题,然后调用 part.writeBodyPartContent( this )
  2. MIMEBodyPart.writeBodyPartContent()调用我们的实用工具方法 …

java garbage-collection finalize finalizer java-8

22
推荐指数
1
解决办法
2182
查看次数

ActivityUnitTestCase getActionBar()返回null

我的FragmentActivity电话getActionBar()onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_expense);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

这通常在模拟器或设备上运行应用程序时工作正常.但是,当我用a测试Activity时ActivityUnitTestCase,getActionBar()总是返回null.

public class NewTransactionTest extends ActivityUnitTestCase<TransactionEditActivity> { 

    private RenamingDelegatingContext myContext;
    private DatabaseHelper myHelper;
    private RuntimeExceptionDao<Account,Long> myDao;
    private Account myBankAccount1;
    private Account myBankAccount2;
    private Account myCategory1;
    private Account myCategory2;
    private Budget myBudget;

    public NewTransactionTest() {
        super(TransactionEditActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        myContext = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test");
        myContext.deleteDatabase(DatabaseHelper.DATABASE_NAME);
    }

    @UiThreadTest
    public void testPreConditions() throws Throwable {
        setActivityContext(myContext); …
Run Code Online (Sandbox Code Playgroud)

java android unit-testing

6
推荐指数
1
解决办法
824
查看次数