protected override void Finalize()
{
try
{
this.FtcpSock.Close();
this.FudpSock6800.Close();
this.FudpSock6801.Close();
this.FudpSock6802.Close();
this.FudpSock6803.Close();
this.FudpSock6804.Close();
this.FudpSock6806.Close();
}
finally
{
this.Finalize();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误信息:
Error 1 Do not override object.Finalize. Instead, provide a destructor.
顺便说一句,这是由第三方公司遵守的原始代码.
如何解决这个问题呢?如何用覆盖结束?
我有以下代码,在我的班级中逐行读取文件时效果很好.
try { FileInputStream in = new FileInputStream(filename);
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
String line;
while((line=reader.readLine())!=null){
// read the file
}
}
catch (Exception e) {
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试将命令添加为close,那么在文件读完之后,我就得到了错误:
in.close();
Error:(131, 9) java: cannot find symbol
symbol: variable in
location: class ReadFile
Run Code Online (Sandbox Code Playgroud)
我在使用后搜索了清洁对象,并在程序结束前需要关闭文件.并在Java上发现了几个帖子,但很多都非常矛盾.关键是,最后我感到非常困惑.
我错了,或者Java编程有点模糊和混乱?我的意思是,显然没有真正使用析构函数,使用finalize是非常值得怀疑的,并且使用close也被认为是不必要的.关于这些问题的一些帖子是矛盾和非决定性的.
那么,如何在这里继续?在我真的需要关闭文件的情况下,如何摆脱这个错误信息?关闭文件真的可有可无和不必要吗?如何为程序完成清理类实例?
为什么finalize()不在这里被称为.代码编译并成功运行,但没有任何输出.
package temp;
public class Temp {
int i;
Temp(int j) {
i = j;
}
public void finalize() {
if (i == 10) {
System.out.println("Finalize called.");
}
}
public static void main(String[] args) {
Temp obj = new Temp(10);
System.gc();
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个简单的代码,并试图调用析构函数,但我不能称之为:(
我知道GarbageCollector会在必要时运行,所以我使用了GC.WaitForPendingFinalizers(); 但它也没有用.
这是我的代码:
class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();
Console.WriteLine("{0} / {1} = {2}", 120, 15, calculator.Divide(120, 15)
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Program finishing");
}
}
class Calculator
{
// Constructor
public Calculator()
{
Console.WriteLine("Calculator being created");
}
// Public Divide method
public int Divide(int first, int second)
{
return first / second;
}
// Destructor
~Calculator()
{
Console.WriteLine("Destructor is called");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
正在创建的计算器
120/15 = 8
程序完成
我究竟做错了什么?为什么我看不到"析构函数被调用"?
我正在阅读Kathy Sierra + Bert Bates 撰写的《OCA Java SE 8程序员I考试指南》。
关于finalize方法,我不太了解。它在第218页上指出:
调用
finalize()实际上可以导致保存对象以免被删除。
稍后在第222页:
您可以从中使对象不符合GC条件
finalize()。
英语不是我的母语,但是我在两种情况下都了解该finalize()方法可以防止对象被垃圾回收?是这样吗 还是我误解了?
我知道每当垃圾收集器收集一个类实例时都会调用finalize().但是,当通过队列将类的实例传递给另一个线程时,我有点困惑.
假设这是Thread1的骨架:
for(i=0; i<1000; i++) {
Packet pkt = new Packet(); // instance of class
pkt.id = i;
thread2.queue.put(pkt);
}
Run Code Online (Sandbox Code Playgroud)
然后,线程2将从队列中删除数据包并执行冗长的操作.这第二个线程是否获得了数据包的"副本",还是通过某种形式的引用?重要的是,如果是通过复制,则可以在线程2完成数据包之前调用在线程1中创建的实例上的finalize().如果是引用,我保证只对包中的信息调用finalize()一次.
这个基本示例可能没有显示重要性,但是我在数据包中存储了一个C指针(来自JNI)以在完成对象时销毁一些内存.如果它是通过副本传递的,则内存可能会在第二个线程完成之前被销毁.如果它是通过引用传递的,那么它应该只在GC看到它不再被两个线程使用时被销毁(我想要的行为).如果后一种情况得不到保证,我不会使用finalize()并使用其他东西,但会更复杂.
我最近遇到了一个与在Finalize方法重载中运行的代码有关的问题.
我大部分都知道与内存管理/性能有关的问题,但我感兴趣的是,是否有任何关于"哪些代码应该/不应该用于Finalize方法"的指南?
例如:
我的案例中的行为是由于引发的事件导致了一些异常.
所以我的问题是 - 关于finalize方法,我必须遵循哪些指导原则(甚至可能强制使用某些工具)?
我有(静态)类GT_MyClass
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
public
property Image : TJpegImage read GetImage;
end;
Run Code Online (Sandbox Code Playgroud)
在函数GetImage我创建FImage如果它还不存在.
class function GT_Myclass.GetImage: TJpegImage;
begin
if not Assigned(FImage) then
begin
FImage := TJpegImage.Create;
end;
Result := FImage;
end;
Run Code Online (Sandbox Code Playgroud)
在最后我想要FreeAndNil(FImage)
finalization
if Assigned(FImage) then
FreeAndNil(FImage);
Run Code Online (Sandbox Code Playgroud)
但在最终版块中,我无法看到私有的var FImage ......
你能帮帮我吗?
谢谢!
BTW:我想要属性Image绝对是静态的
我正在阅读这篇文章,我无法真正理解最终化对象(覆盖该finalize方法的对象)在回收之前至少需要2个GC周期.
在可回收可完成对象之前,它至少需要两次垃圾收集周期(在最好的情况下).
有人还可以详细解释一个可终结的对象如何可以采用多个GC循环进行回收?
我的逻辑论点是,当我们覆盖finalize方法时,运行时必须使用垃圾收集器注册此对象(以便GC可以调用finalize此对象,这使我认为GC将引用所有可终结的对象).为此,GC必须对可终结对象保持强有力的参考.如果是这种情况,那么该对象如何成为GC首先进行回收的候选对象?我通过这个理论达成了矛盾.
PS:我知道覆盖finalize不是推荐的方法,并且自Java 9以来不推荐使用此方法.
(此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。)
为什么finalize()在Java 9中不推荐使用该方法?
是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(尽管仅一次)或尝试关闭其中的某些本机资源(比完全不关闭更好))以及许多其他方法可能会被错误地使用。
那么,finalize()真的有这么危险的或绝对无用,它是必要踢出来的Java?
finalize ×10
java ×6
c# ×3
.net ×1
class ×1
code-cleanup ×1
coding-style ×1
delphi ×1
delphi-xe6 ×1
destructor ×1
file-io ×1
java-9 ×1
overriding ×1
properties ×1
static ×1