KSoap2 出于某种原因在空对象引用上引发尝试调用虚拟方法'int java.io.InputStream.read(byte[], int, int)'


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);
});

类连接器和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();
}
}

我不明白它为什么会出现这个错误!我的猜测是因为我通过了一个";本地参考";s1、s2从主线程到另一个线程。但这似乎很奇怪,因为我已经做了很多次了,而且都有效。这里怎么了!

我正在使用:

implementation.com.google.code.ksoap2 android:ksoap2 android:3.6.2'

我也使用这些线路来绕过安全:

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();
}
}
}

我的清单也给出了:

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

当我用字符串文字替换s1、s2时,这是可以的。我可以声称s1,s2不是prorems

我的日志:

进程:com.example.messenger,PID:6942java.lang.NullPointerException:尝试在null对象上调用虚拟方法"int java.io.InputStream.read(byte[],int,int("参考网址:org.ksoap2.transport.HttpTransportSE.readDebug(HttpTransportSE.java:320(网址:org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:271(网址:org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118(网址:org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113(网址:com.example.messenger.Connector.MyRunnable.run(Connector.java:62(

原因是我的流过大,有1000。所以,s2刚好等于123����������������������������������������������������.s1,s2确实是原因。只需将byte[]login_info=new byte[1000]更改为byte[]login_info=new byte[(int(f.size((];。这解决了我的问题。感谢您抽出时间:D

最新更新