无法处理Firebase Admin SDK

时间:2018-02-22 06:48:05

标签: java firebase firebase-realtime-database firebase-admin

当我的应用程序连接到互联网时,我的代码运行正常,但当它处于脱机状态时,我无法正确处理异常。我希望我的应用程序在应用程序未连接到Internet时显示错误/警告对话框。我试图使用IOException捕获异常,但它不起作用。

例外是:

    Feb 22, 2018 12:20:28 PM com.google.api.client.http.HttpRequest execute
WARNING: exception thrown while executing request
java.net.UnknownHostException: accounts.google.com
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1138)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1032)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1316)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)
    at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:383)
    at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:175)
    at com.google.firebase.FirebaseApp$TokenRefresher$1.call(FirebaseApp.java:548)
    at com.google.firebase.FirebaseApp$TokenRefresher$1.call(FirebaseApp.java:544)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我的代码:

package gces;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import javax.swing.*;
import java.io.FileInputStream;
import java.io.IOException;

public class FirebaseEngine {
    static FirebaseDatabase database;

    FirebaseEngine() {
    }

    public static void initialize(){
        try {
            FileInputStream serviceAccount = new FileInputStream("gcesitexpo-firebase-adminsdk-61f7n-c33a170f7c.json");

            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("https://gcesitexpo.firebaseio.com/")
                    .build();

            FirebaseApp.initializeApp(options);

            database = FirebaseDatabase.getInstance();

            DatabaseReference ref = FirebaseEngine.database.getReference("users");
        }
        catch (IOException e){
            e.printStackTrace();
            JOptionPane.showMessageDialog(App.adminFrame, "Error while connecting to the realtime database", "Connection Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

正如您从异常的堆栈跟踪中看到的那样,它不是直接来自您应用中的方法调用。它正在发生,因为Firebase SDK在其控制的另一个线程(通过某些Executor)上安排了一些代码。 您无法捕获该异常,因为它不会直接发生在您应用的控制线程中。 (您无法捕获另一个线程中发生的异常。)

如果该异常导致JVM进程崩溃,您应该file a bug report

如果该异常没有导致您的JVM进程崩溃,那么它可能只是等待它再次获得网络访问才能重试。没有网络连接,Firebase Admin SDK不是很有用。如果在重新获得连接后SDK继续不起作用,您可能还应该提交错误。