简体   繁体   English

KSoap2 throws Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference for some reason

[英]KSoap2 throws Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference for some reason

Login_btn.setOnClickListener((View v) ->
        {
            byte[] login_info = new byte[1000];

            FileInputStream fIn;
            try {
                fIn = new FileInputStream(f);
                fIn.read(login_info);
                fIn.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            String str =  new String(login_info);
            login_info = null;

            int index = str.indexOf('-');
            String s1 = str.substring(0, index);
            String s2 = str.substring(index + 1);

            List<Parameter> parameters = new ArrayList<>();
            parameters.add(new Parameter("user_name", s1));
            parameters.add(new Parameter("pass", s2));

            SoapObject that_user =
                    Connector.Send_request( "Login", null, null, parameters);

        });

class Connector and MyRunnable: class 连接器和 MyRunnable:

lass MyRunnable implements Runnable
{
    public static final String NAME_SPACE = "http://tempuri.org/";
    public static final String URL = "https://192.168.1.176:44383/Messenger_service.asmx";

    private SoapObject obj;
    private String Class_name, method_name;
    private Class class_obj;
    private List<Parameter> parameters;

    public MyRunnable(String method_name, String Class_name, Class class_obj,
                      List<Parameter> parameters)
    {
        this.Class_name = Class_name;
        this.class_obj = class_obj;
        this.method_name = method_name;
        this.parameters = parameters;
    }

    @Override
    public void run()
    {
        SoapObject request = new SoapObject(NAME_SPACE, method_name);

        for(Parameter par : parameters)
            request.addProperty(par.getName(), par.getObj());

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        if(Class_name != null)
        {
            envelope.addMapping(NAME_SPACE, Class_name, class_obj);
        }

        HttpTransportSE transporter = new HttpTransportSE(URL);
        transporter.debug = true;

        try
        {
            transporter.call(NAME_SPACE + method_name, envelope);
            obj = (SoapObject) envelope.getResponse();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
    }

    public SoapObject getObj()
    {
        return obj;
    }
}

public class Connector
{
    public static final String NAME_SPACE = "http://tempuri.org/";

    public static SoapObject Send_request(String method_name, String Class_name, Class class_obj,
                                          List<Parameter> parameters)
    {
        MyRunnable r = new MyRunnable(method_name, Class_name, class_obj, parameters);
        Thread t = new Thread(r);

        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return r.getObj();
    }
}

I can't figure out why it throws this error, My guess is because of me passing a "local reference" of s1.我不知道为什么会抛出这个错误,我的猜测是因为我传递了 s1 的“本地引用”。 s2 from main thread to another thread. s2 从主线程到另一个线程。 But it seems weird because I've done these many times and they all work.但这似乎很奇怪,因为我已经做了很多次而且它们都有效。 What's wrong here!这里有什么问题!

I'm using:我在用着:

implementation 'com.google.code.ksoap2-android:ksoap2-android:3.6.2'实施 'com.google.code.ksoap2-android:ksoap2-android:3.6.2'

I also use these lines to bypass security:我还使用这些行来绕过安全性:

public class ByPasser
{
    public static void disableSSLCertificateChecking()
    {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
        } };

        try {
            SSLContext sc = SSLContext.getInstance("TLS");

            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
            {
                @Override
                public boolean verify(String hostname, SSLSession session) { return true; }
            });
        }
        catch (KeyManagementException e)
        {
            e.printStackTrace();
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
    }
}

My manifest is also given:我的清单也给出了:

< uses-permission android:name="android.permission.INTERNET" /> < 使用权限 android:name="android.permission.INTERNET" />

It's okay when i replace s1, s2 with string literals.当我用字符串文字替换 s1, s2 时没关系。 I can claim that s1, s2 are not the prolems我可以声称 s1, s2 不是问题

My Logcat:我的日志猫:

Process: com.example.messenger, PID: 6942 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference at org.ksoap2.transport.HttpTransportSE.readDebug(HttpTransportSE.java:320) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:271) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113) at com.example.messenger.Connector.MyRunnable.run(Connector.java:62) Process: com.example.messenger, PID: 6942 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference at org.ksoap2 .transport.HttpTransportSE.readDebug(HttpTransportSE.java:320) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:271) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118) at org. ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113) 在 com.example.messenger.Connector.MyRunnable.run(Connector.Z93F725A07423D21B88)

The reason is because my stream is oversized with 1000. So, s2 just equals 123����������������������������������������������������.原因是因为我的 stream 过大了 1000。所以,s2 正好等于 123 ������������������������������������ ��������������������。 s1, s2 is the reason indeed. s1, s2 确实是原因。 Just change byte[] login_info = new byte[1000] to byte[] login_info = new byte[(int)f.size()];.只需将 byte[] login_info = new byte[1000] 更改为 byte[] login_info = new byte[(int)f.size()];。 That solves my problem.这解决了我的问题。 Thank you your time: D谢谢你的时间:D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.io.InputStream.read(byte[])” - java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[])' on a null object reference 尝试在空对象引用[Android]上调用虚方法'int java.util.Random.nextInt(int)' - Attempt to invoke virtual method 'int java.util.Random.nextInt(int)' on a null object reference [Android] 如何解决“试图在java.io.StringReader的空对象引用上调用虚拟方法&#39;int java.lang.String.length()&#39;”? - How to fix “Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference at java.io.StringReader”? java.lang.NullPointerException:尝试在空对象引用上调用虚方法&#39;ActionBar.setNavigationMode(int)&#39; - java.lang.NullPointerException: Attempt to invoke virtual method 'ActionBar.setNavigationMode(int)' on a null object reference 尝试在空对象引用上调用接口方法&#39;int org.ksoap2.serialization.KvmSerializable.getPropertyCount()&#39; - Attempt to invoke interface method 'int org.ksoap2.serialization.KvmSerializable.getPropertyCount()' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法FloatingActionButton.setImageResource(int)&#39; - java.lang.NullPointerException: Attempt to invoke virtual method FloatingActionButton.setImageResource(int)' on a null object reference Android Studio Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference - Android Studio Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 尝试在 null object 参考上调用虚拟方法 'void android.view.View.measure(int, int)' - Attempt to invoke virtual method 'void android.view.View.measure(int, int)' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用虚方法&#39;int android.view.ViewGroup.getPaddingLeft()&#39; - java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getPaddingLeft()' on a null object reference 尝试在空对象引用上调用虚拟方法 &#39;android.content.Context.getSharedPreferences(java.lang.String, int)&#39; - Attempt to invoke virtual method 'android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM