尝试在空对象引用上调用虚拟方法 'int java.lang.String.length()',发现该对象不为 null 并初始化



我知道类星体已经问了很多次了,但我真的没有找到解决方案。我知道错误是由于对象意图为空而来的,但怎么会发生呢?如果我从图库中选择图片?这就是我得到的错误

E/Volley: [497] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at java.net.URLEncoder.encode(URLEncoder.java:205)
at com.android.volley.Request.encodeParameters(Request.java:491)
at com.android.volley.Request.getBody(Request.java:477)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:245)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:219)
at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:97)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
D/EGL_emulation: eglMakeCurrent: 0xa7685060: ver 3 1 (tinfo 0xa7683280)
D/EGL_emulation: eglMakeCurrent: 0xa7685060: ver 3 1 (tinfo 0xa7683280)

这是我的目标部分:

btnSelectImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dexter.withActivity(uploadimage.this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent,"Select image"),1);
}

当我谈到这部分代码时,它的秋天,couse的意图是空的?但为什么会这样?

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode==1 && requestCode==RESULT_OK && data!= null){
Uri filePath = data.getData();
try {
InputStream inputStream = getContentResolver().openInputStream(filePath);
bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
imageStore(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}

问题出在哪里?我添加以显示READ_EXTERNAL_STORAGE的权限。

如果相关的话,这就是我的全部代码。

package com.example.yacovapp;
import android.Manifest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.toolbox.StringRequest;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import android.util.Base64;
public class uploadimage extends AppCompatActivity {
Button btnSelectImage, btnUploadImage;
ImageView imageView;
Bitmap bitmap;
String encodedImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_uploadimage);
btnSelectImage = (Button) findViewById(R.id.btnSelectImage);
btnUploadImage = (Button) findViewById(R.id.buttonUploadImage);
imageView = findViewById(R.id.imView);
btnSelectImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dexter.withActivity(uploadimage.this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent,"Select image"),1);
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) { }
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { }
}).check();
}
});
btnUploadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StringRequest request = new StringRequest(Request.Method.POST, "https://kerron.xyz/htdocs/images.php"
, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(uploadimage.this, response, Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(uploadimage.this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map <String, String> param = new HashMap<>();
param.put("image", encodedImage);
return param;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(uploadimage.this);
requestQueue.add(request);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode==1 && requestCode==RESULT_OK && data!= null){
Uri filePath = data.getData();
try {
InputStream inputStream = getContentResolver().openInputStream(filePath);
bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
imageStore(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private void imageStore(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte [] imageBytes = stream.toByteArray();
encodedImage = android.util.Base64.encodeToString(imageBytes,Base64.DEFAULT);
}
}

php文件:(在服务器上的public_html文件夹中,我创建了一个文件夹htdocs,在这个文件夹中我有项目的所有php文件(

<?php
$conn = mysqli_connect("78.140.191.36","kerronxy_yacov", "]k2oIl?WBRPh", "kerronxy_users");
if(isset($_POST['image'])) {
$target_dir = "htdocs/";
$image = $_POST['image'];
$imageStore = rand()."_".time()."jpeg";
$target_dir = $target_dir."/".$imageStore;
file_put_contents($target_dir, base64_decode($image));
$select = "INSERT INTO images (image) VALUES ($imageStore)";
$responce = mysqli_query($conn, $select);
if($responce) {
echo "Image Uploaded";
mysqli_close($conn);
}
}

Logcat错误表示Nullpointer exception意味着一些变量在运行时为null。您可能在post参数中放入了一些null值或关键字。请确保您的postParams在您的情况下encodedImage在调用请求之前不为null,因为从这些方法返回的键或值不应为null

希望这能有所帮助。。

最新更新