'ExceptionInInitializerError & IllegalStateException in RetrofitBuilder response

I was making a all type converter app but why am I getting ExceptionInInitializerError & IllegalStateException in RetrofitBuilder at .build() & in MainActivity at getRetrofitInstance() part. The line is below:

 RetrofitInterface retrofitInterface;
                    retrofitInterface = RetrofitBuilder.getRetrofitInstance().create(RetrofitInterface.class);

In currency section API fetching is not working and moreover this is my first time using API.

The Errors:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nightxstudio.omniconverter, PID: 17635
    java.lang.ExceptionInInitializerError
        at okhttp3.internal.platform.Platform.get(Platform.java:85)
        at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)
        at retrofit2.Retrofit$Builder.build(Retrofit.java:614)
        at com.nightxstudio.omniconverter.Retrofit.RetrofitBuilder.getRetrofitInstance(RetrofitBuilder.java:13)
        at com.nightxstudio.omniconverter.MainActivity$2.onClick(MainActivity.java:117)
        at android.view.View.performClick(View.java:7585)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194)
        at android.view.View.performClickInternal(View.java:7541)
        at android.view.View.access$3900(View.java:842)
        at android.view.View$PerformClick.run(View.java:28875)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:255)
        at android.app.ActivityThread.main(ActivityThread.java:8212)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
     Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 30
        at okhttp3.internal.platform.AndroidPlatform.buildIfSupported(AndroidPlatform.java:238)
        at okhttp3.internal.platform.Platform.findPlatform(Platform.java:202)
        at okhttp3.internal.platform.Platform.<clinit>(Platform.java:79)
        at okhttp3.internal.platform.Platform.get(Platform.java:85) 
        at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263) 
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229) 
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202) 
        at retrofit2.Retrofit$Builder.build(Retrofit.java:614) 
        at com.nightxstudio.omniconverter.Retrofit.RetrofitBuilder.getRetrofitInstance(RetrofitBuilder.java:13) 
        at com.nightxstudio.omniconverter.MainActivity$2.onClick(MainActivity.java:117) 
        at android.view.View.performClick(View.java:7585) 
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1194) 
        at android.view.View.performClickInternal(View.java:7541) 
        at android.view.View.access$3900(View.java:842) 
        at android.view.View$PerformClick.run(View.java:28875) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:255) 
        at android.app.ActivityThread.main(ActivityThread.java:8212) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) 
I/Process: Sending signal. PID: 17635 SIG: 9

Retrofit Builder class:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitBuilder {
    private static Retrofit retrofit;
    public static Retrofit getRetrofitInstance(){
        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl("https://v6.exchangerate-api.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

Retrofit Interface:

import com.google.gson.JsonObject;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;

public interface RetrofitInterface {
    @GET("v6/68b207579a140f89fd5b6c53/latest/{currency}")
    Call<JsonObject> getExchangeCurrency(@Path("currency") String currency);
}

MainActivity:

calculate.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("SetTextI18n")
            @Override
            public void onClick(View v) {

                resultHint.setVisibility(View.GONE);
                valueEditText.onEditorAction(EditorInfo.IME_ACTION_DONE);
                final double input = Double.parseDouble(valueEditText.getText().toString());

        //  Currency Conversions:-

                if(typeDropDownText.getText().toString().equals("Currency")){
                    RetrofitInterface retrofitInterface;
                    retrofitInterface = RetrofitBuilder.getRetrofitInstance().create(RetrofitInterface.class);
                    Call<JsonObject> call = retrofitInterface.getExchangeCurrency(fromDropDownText.getOnItemClickListener().toString());
                    call.enqueue(new Callback<JsonObject>() {
                        @Override
                        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                            JsonObject res = response.body();
                            assert res != null;
                            JsonObject rates = res.getAsJsonObject("rates");
                            double currencyToBeConverted = Double.parseDouble(valueEditText.getText().toString());
                            currencyToBeConverted = Double.parseDouble(String.valueOf(valueEditText.getText()));
                            double multiplier = Double.parseDouble(rates.get(toDropDownText.getOnItemClickListener().toString()).toString());
                            amount = currencyToBeConverted * multiplier;
                            String amountString = String.valueOf(amount);
                            result.setText(amountString);
                        }

                        @Override
                        public void onFailure(Call<JsonObject> call, Throwable t) {

                        }
                    });


                }
        }

I had used InputTextLayout and AutoCompleteTextView for dropdown menu.

It's constantly stating problem primarily in RetrofitBuilder class at .build(); section. I have performed tons of changes but nothing worked. Please anyone help me out.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source