在Java中,如何强制自动关闭警告传播到类的调用者?

在Java中,如何强制自动关闭警告传播到类的调用者?,java,selenium,selenium-webdriver,try-with-resources,autocloseable,Java,Selenium,Selenium Webdriver,Try With Resources,Autocloseable,我不熟悉Java的自动关闭接口,但对Java并不陌生。我试图通过调用driver.quit,强制客户端代码请求WebDriver实例在使用完驱动程序后关闭驱动程序 我想要一种方法来强制任何实例化WebDriver实例的方法关闭它 因此,我创建了一个实现AutoClosable的新类: 现在,我不是直接实例化WebDriver WebDriver driver=new FirefoxDriver,而是实例化这个类的实例,并让它返回一个WebDriver实例,如以下示例所示: public WebD

我不熟悉Java的自动关闭接口,但对Java并不陌生。我试图通过调用driver.quit,强制客户端代码请求WebDriver实例在使用完驱动程序后关闭驱动程序

我想要一种方法来强制任何实例化WebDriver实例的方法关闭它

因此,我创建了一个实现AutoClosable的新类:

现在,我不是直接实例化WebDriver WebDriver driver=new FirefoxDriver,而是实例化这个类的实例,并让它返回一个WebDriver实例,如以下示例所示:

public WebDriver launchDriver()
{
    WebDriverLauncher webDriverLauncher = new WebDriverLauncher();

    WebDriver driver = webDriverLauncher.getDriver();

    return driver;
}
public WebDriverLauncher launchDriver()
{
     WebDriverLauncher webDriverLauncher = new WebDriverLauncher();
     return webDriverLauncher;
}
当我这样做时,我收到一个警告/错误:资源泄漏:“webDriverLauncher”从未关闭

由于调用方方法中正在使用资源即WebDriver,因此无法关闭此方法中的资源,因此我希望强制launchDriver的调用方关闭该驱动程序

因此,我决定让该方法返回WebDriverLauncher的一个实例,如下例所示:

public WebDriver launchDriver()
{
    WebDriverLauncher webDriverLauncher = new WebDriverLauncher();

    WebDriver driver = webDriverLauncher.getDriver();

    return driver;
}
public WebDriverLauncher launchDriver()
{
     WebDriverLauncher webDriverLauncher = new WebDriverLauncher();
     return webDriverLauncher;
}
这样,调用方就可以通过调用webDriverLauncher.getDriver来访问驱动程序,并被警告关闭资源,我想是这样的

然而,当我尝试这样做时,警告信息完全消失了。换句话说,我不再看到关闭资源的警告-无论是在launchDriver类/方法中,还是在我提到的调用方/客户机类中,我都希望出现警告,以便警告调用此方法的人关闭资源

我想了解的是:

1如果资源从未关闭,为什么警告没有传播到调用方类

2为什么返回webDriverLauncher时警告消失,而返回driver时警告不消失

3是否有办法修改代码以强制向调用方传播警告?以警告此方法的调用方关闭资源

4如果无法做到这一点,可以采取什么措施强制客户端关闭WebDriver

谢谢

使用:


在其他情况下,AutoClosable接口是一个约束条件,用于确定在Try with resources语句中可以使用哪种类型。但如果我们想迫使客户谨慎地使用资源,我的看法是这样的。我们可以通过启用属性-Djava.security.manager for jar来限制资源创建私有构造函数+禁用反射访问,并允许客户机只向资源工厂提供要在该资源上调用的方法

public class MyResource implements AutoCloseable{
public static class ResourceFactory{
    public static void useResourceSafely(Consumer<MyResource> work) {
        try(MyResource res = new MyResource()){
        work.accept(res);
        }
        catch(Exception e)
        {
            e.printStackTrace();
            //you may even check for Suppressed exceptions
        }
    }
}

private MyResource() {
    System.out.println("Resource created");
}
public void doWork() {
    System.out.println("resource in use");
}
@Override
public void close() throws Exception {
    System.out.println("Closing myResource");
    
}   

提示:这可能不是推荐的方法,但只是尝试这样做。

阅读javadocs退出资源试块时自动调用自动关闭对象的关闭方法避免自动关闭和仅使用驱动程序有什么不对。退出;?恐怖蝙蝠:你回答了三个问题中的哪一个?我看过文件了@JeffC我从几十个其他方法调用这个方法,每个方法都将驱动程序传递给许多不同的函数。。当程序员完成WebDriver时,他可能会忘记关闭它。。所以我想强制执行。。我希望它在一个中心位置强制执行..如果您使用JUnit或TestNG,您可以创建一个关闭驱动程序实例的方法,并使用属性AfterClass、AfterMethod等对其进行标记。在不使用AutoClosable的情况下,该方法可以执行您想要的操作。如果你不想这样做或不能这样做,这是一个培训问题。确保每个人都知道关闭驱动程序,并提供他们可以调用的单一方法。进行代码检查,并将其添加到检查表中,以便在他们可以签入之前进行验证。@JeffC谢谢!我将研究JUnit和TestNG。当有人将鼠标悬停在函数上方时,我已经发出关闭浏览器的警告。然而,我想我可能会以某种方式使用AutoClosable强制执行此操作,但显然这是不可能的..抱歉,这并不能回答问题。我知道如何利用资源进行尝试。。请重新阅读OP中的3个具体问题。谢谢!
public static void main(String[] args) throws Exception{     
        ResourceFactory.useResourceSafely(s->{
            s.doWork();
            System.out.println("Check 1");
            s.doWork();
            System.out.println("Check 2");
        });
    }