Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 僵尸异常在被捕获后幸存下来_Java_Linux_Exception_Browser_Libgdx - Fatal编程技术网

Java 僵尸异常在被捕获后幸存下来

Java 僵尸异常在被捕获后幸存下来,java,linux,exception,browser,libgdx,Java,Linux,Exception,Browser,Libgdx,我在尝试使用LibGDX游戏引擎中的Gdx.net.openURI(String)时遇到了一个非常奇怪的问题。这是一种只需在我的浏览器中打开页面的方法。如果有效,则返回true;如果无效,则返回false它工作(打开页面)并返回true,但我的控制台中会出现一个随机异常,此异常不会被捕获 boolean opened; try { opened = Gdx.net.openURI(DONATE_URL); //at net.jumpai.client.menu.DonateDialog.

我在尝试使用LibGDX游戏引擎中的
Gdx.net.openURI(String)
时遇到了一个非常奇怪的问题。这是一种只需在我的浏览器中打开页面的方法。如果有效,则返回true;如果无效,则返回false它工作(打开页面)并返回true,但我的控制台中会出现一个随机异常,此异常不会被捕获

boolean opened;
try
{
    opened = Gdx.net.openURI(DONATE_URL); //at net.jumpai.client.menu.DonateDialog.<init>(DonateDialog.java:30)
}
catch(Exception ex)
{
    opened = false;
}

// some other code that is always executed
boolean打开;
尝试
{
opened=Gdx.net.openURI(捐赠URL);//位于net.jumpai.client.menu.DonateDialog.(DonateDialog.java:30)
}
捕获(例外情况除外)
{
开放=假;
}
//总是执行的其他一些代码
这是我得到的结果:

java.io.IOException: Cannot run program "sensible-browser": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at java.lang.Runtime.exec(Runtime.java:620)
    at java.lang.Runtime.exec(Runtime.java:485)
    at org.lwjgl.LWJGLUtil$1.run(LWJGLUtil.java:406)
    at org.lwjgl.LWJGLUtil$1.run(LWJGLUtil.java:404)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.lwjgl.LWJGLUtil.execPrivileged(LWJGLUtil.java:404)
    at org.lwjgl.LinuxSysImplementation.openURL(LinuxSysImplementation.java:78)
    at org.lwjgl.Sys.openURL(Sys.java:257)
    at com.badlogic.gdx.backends.lwjgl.LwjglNet.openURI(LwjglNet.java:66)
    at net.jumpai.client.menu.DonateDialog.<init>(DonateDialog.java:30)
    at net.jumpai.client.world.online.OnlineWorldScreen.donateClicked(OnlineWorldScreen.java:434)
    at net.jumpai.util.event.ListenableImpl.trigger(ListenableImpl.java:25)
    at net.jumpai.client.menu.AccountMenu.lambda$new$0(AccountMenu.java:54)
    at net.jumpai.util.ui.listener.ClickAdapter.lambda$new$0(ClickAdapter.java:43)
    at net.jumpai.util.ui.listener.ClickAdapter.clicked(ClickAdapter.java:50)
    at com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89)
    at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59)
    at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351)
    at com.badlogic.gdx.InputMultiplexer.touchUp(InputMultiplexer.java:96)
    at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:332)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:217)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 22 more
java.io.IOException:无法运行程序“敏感浏览器”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
位于java.lang.Runtime.exec(Runtime.java:620)
位于java.lang.Runtime.exec(Runtime.java:485)
在org.lwjgl.LWJGLUtil$1.run(LWJGLUtil.java:406)
位于org.lwjgl.LWJGLUtil$1.run(LWJGLUtil.java:404)
位于java.security.AccessController.doPrivileged(本机方法)
位于org.lwjgl.LWJGLUtil.execPrivileged(LWJGLUtil.java:404)
位于org.lwjgl.LinuxSysImplementation.openURL(LinuxSysImplementation.java:78)
位于org.lwjgl.Sys.openURL(Sys.java:257)
位于com.badlogic.gdx.backends.lwjgl.LwjglNet.openURI(LwjglNet.java:66)
net.jumpai.client.menu.DonateDialog.(DonateDialog.java:30)
在net.jumpai.client.world.online.OnlineWorldScreen.donateClicked(OnlineWorldScreen.java:434)
在net.jumpai.util.event.ListenableImpl.trigger处(ListenableImpl.java:25)
net.jumpai.client.menu.AccountMenu.lambda$new$0(AccountMenu.java:54)
位于net.jumpai.util.ui.listener.ClickAdapter.lambda$new$0(ClickAdapter.java:43)
在net.jumpai.util.ui.listener.ClickAdapter.clicked(ClickAdapter.java:50)中
在com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:89)上
位于com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:59)
位于com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:351)
在com.badlogic.gdx.InputMultiplexer.touchUp(InputMultiplexer.java:96)
位于com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:332)
位于com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:217)
位于com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:126)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:247)
在java.lang.ProcessImpl.start(ProcessImpl.java:134)处
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 还有22个
我确保这段代码没有执行两次,这个问题不是一次工作另一次不工作的情况。这给我留下了深刻的印象。这真的是一个例外吗?我不知道它在哪里可以被抓到和打印出来。如何防止这种情况发生


我使用的是ArchLinux,我的浏览器是Chromium。

这些异常将在并行线程中抛出,因此无法在主线程中捕获它们。打印到控制台是Java中处理异常的默认行为。尝试使用
Thread.setUncaughtExceptionHandler()
方法,它可以帮助您定义处理这种情况的更具体的行为。

正如Perry Monschau在命令中提到的,异常是由
Gdx.net.openURI()
调用的内部方法的
Try
-
catch
打印的

因此,我制定了一种方法来避免控制台中出现不必要的错误:

public static boolean openURI(String uri)
{
    PrintStream prevErr = System.err;
    try
    {
        System.setErr(NullPrintStream.instance);
    }
    catch(SecurityException ignored)
    {
        return Gdx.net.openURI(uri);
    }

    try
    {

        return Gdx.net.openURI(uri);
    }
    finally
    {
        System.setErr(prevErr);
    }
}
在控制台中打印内容而不首先询问的方法是LWJGL的LinuxSysImplementation(注释不是我的):


虽然我对libGDX不是特别熟悉,但是openURI是否有一个输出异常的try-catch呢?如果已捕获,则您的外部尝试捕获将无法捕获它。在该代码之后,“打开的”输出是什么?我猜这是假的。
// Linux may as well resort to pure Java hackery, as there's no Linux native way of doing it
// right anyway.

String[] browsers = {"sensible-browser", "xdg-open", "google-chrome", "chromium", "firefox", "iceweasel", "mozilla", "opera", "konqueror", "nautilus", "galeon", "netscape"};

for ( final String browser : browsers ) {
    try {
        LWJGLUtil.execPrivileged(new String[] { browser, url });
        return true;
    } catch (Exception e) {
        // Ignore
        e.printStackTrace(System.err);
    }
}